2013-03-24 72 views
5

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?

+1

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

+4

Tôi không thấy dấu hỏi. – mfontanini

+0

@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. –

Trả lời

3

Đi với giải pháp MatrixRow của bạn, nhưng chuyển chỉ mục của hàng tới từng đối số MatrixRow làm đối số hàm tạo. Các MatrixRow có thể lưu số đó, và sử dụng nó trong bất kỳ thông báo ngoại lệ nó tạo ra.

1

Sử dụng operator()() thay vì operator[](). Xem này link. Tất cả những gì bạn cần liên kết này xem xét.

+0

Đó chỉ là xấu xí. Những ma trận này sử dụng cú pháp đặc biệt không phải C++ để lập chỉ mục. –

+0

'm [i] [j]' nói: "Xin chào' m (i, j) '. Bạn quá xấu xí, nhưng bạn làm việc rất tốt và thiết kế của bạn đơn giản hơn nhiều. Tại sao?" – Narek

+0

Ứng dụng tương tự cũng có khả năng cũng sử dụng mảng 1D (vectơ). Liệu họ cũng có quá tải toán tử()? Bây giờ chúng khác với mảng gốc và std :: vector; sự nhầm lẫn xảy ra sau đó. –

Các vấn đề liên quan