Tôi có một lớp ma trận, sử dụng [] [] để truy cập các phần tử. Khi một (hoặc cả hai) chỉ mục nằm ngoài giới hạn, tôi phải ném CIndexException. Đó là một lớp lưu trữ văn bản ở định dạng này "Chỉ mục không hợp lệ [a] [b]", trong đó a và b là số.Ném ngoại lệ khi mảng nằm ngoài giới hạn
Đây là thực hiện hiện tại của tôi của lớp CIndexException
class CIndexException
{
string text;
public:
CIndexException (int a, int b)
{
ostringstream oss;
oss << "Invalid index [";
oss << a;
oss << "][";
oss << b;
oss < "]";
text = oss.str();
}
string get() const
{
return text;
}
};
Matrix được biểu diễn dưới dạng một mảng 2D của đôi, nó được khởi tạo trong constructor:
CMatrix(int r, int c)
{
colls = c;
rows = r;
mat = new double * [rows];
for (int i = 0; i < rows; i++)
{
mat[i] = new double [colls];
for (int j = 0; j < colls; j++)
mat[i][j] = 0;
}
}
Để có được yếu tố duy nhất, tôi bị quá tải [ ] nhà điều hành như thế này:
double * operator[] (int x) const
{
return mat[x];
}
Khi tôi nhập [2] [3], chức năng này lại giải quyết [] đầu tiên, trả về con trỏ tới một mảng và ký tự [] thứ hai được giải quyết như bình thường.
Tôi có thể dễ dàng kiểm tra xem chỉ mục đầu tiên có nằm ngoài giới hạn hay không, nhưng tôi gặp sự cố khi kiểm tra chỉ mục thứ hai. Tôi nghĩ về việc tạo ra lớp thứ hai, MatrixRow, đại diện cho một hàng ma trận. Sau đó, tôi sẽ có mảng MatrixRows. Để [] [] hoạt động, cả hai lớp đó sẽ có toán tử quá tải []. Bằng cách đó tôi sẽ có thể kiểm tra cả hai chỉ mục, nhưng tôi không có ý tưởng làm thế nào để "tham gia" chúng thành một ngoại lệ. Làm thế nào tôi có thể báo cáo cả hai chỉ số trong đối tượng ngoại lệ trong khi sử dụng thiết kế này?
Bạn đã trả lời câu hỏi của mình, bạn cần tạo một lớp 'MatrixRow', quá tải toán tử' [] 'trên đó và bạn đã hoàn thành. Có chuyện gì vậy? – antonijn
Tôi không thấy dấu hỏi. – mfontanini
@antonijn - vấn đề là lớp 'MatrixRow' cần báo cáo cả hai chỉ mục được sử dụng trong trường hợp ngoại lệ, nhưng thông thường nó sẽ chỉ biết cột. –