2012-01-01 38 views
7

Tôi có một thành viên của lớp A trong lớp của riêng tôi mà hàm tạo có nhiều tham số. Im chuyển tiếp các tham số của lớp riêng của tôi đến constructor của lớp A. Nhưng quan trọng là các tham số này là chính xác, vì vậy tôi cần kiểm tra chúng trước khi cấu trúc thành viên của A. Và heres vấn đề: Tôi có thể bỏ qua các thành viên trong danh sách intialization thành viên, hiệu quả gọi hàm dựng mặc định. Sau khi kiểm tra trong constructor tôi có thể gọi A constructor trong một assigment. Mặc dù, điều này tạo ra một lỗi vì destructor của A là riêng tư.Thực hiện kiểm tra trước khi khởi tạo danh sách

Làm cách nào để giải quyết vấn đề này?

MyClass::MyClass(int someParam) : otherMember(2){ 
//checks for someParam 
member = A(someParam); // <- produces error 
} 
+0

Nói chuyện với tác giả của lớp 'A' và ép buộc cô ấy làm cho hàm tạo của' A' hoạt động hợp lý trong trường hợp giá trị tham số bất hợp pháp. –

+0

Có thể chấp nhận xây dựng 'A' và sau đó kiểm tra sau khi thực tế? – Cameron

+0

Tôi thực sự đã cố gắng thuyết phục Sun thực hiện điều này trong Java, nhưng họ đã từ chối. Nó dễ dàng hơn để lừa trong Java bởi vì bạn có thể gọi một hàm khởi tạo từ một hàm khác. – Neil

Trả lời

9

Bạn sẽ cần một trình phá hủy có thể truy cập bất kể bạn làm gì. Tuy nhiên, để giải quyết câu hỏi của bạn, một lựa chọn sẽ được gọi một hàm tĩnh để kiểm tra các thông số từ bên trong initializer:

class MyClass { 
    private: 
    static void checkParam(int); 
// ... 
}; 

MyClass::MyClass(int someParam) : otherMember((checkParam(someParam), 2)) { 
    // ... 
} 

static void MyClass::checkParam(int someParam) { 
    if (...) throw someException(); 
} 

Lưu ý rằng , được sử dụng có các nhà điều hành dấu phẩy, không phải là một dấu phân cách lập luận - nó đánh giá cả hai bên trái và biểu thức đúng, và ném đi kết quả của trái.

+0

Có ngoại lệ được ném trong checkParam() vẫn làm gián đoạn luồng chương trình không? Nếu câu trả lời cho câu hỏi này là có, đây chính xác là những gì tôi cần. Đối với những người bạn của những người đang tự hỏi về destructor tư nhân, một tham chiếu của nó tính phản đối; Tôi gueess bằng cách sử dụng con trỏ đếm tham chiếu appropiate sẽ tốt hơn. – Paranaix

+0

Có. checkParam sẽ được đánh giá trước '2', vì vậy nếu nó ném,' 2' sẽ không đánh giá, và do đó hàm tạo của 'otherMember' không thể được gọi – bdonlan

0

Tôi thấy hai cách tiếp cận này:

  1. Hãy chắc chắn rằng lớp A có thể được sử dụng với một constructor tham số-ít hơn, và thiết lập someParam trong một phương pháp riêng biệt: A.SetSomeParam(someParam)

  2. Không kế thừa từ A, nhưng giữ một đối tượng thành viên của loại A, và sau đó bạn có thể xây dựng nó bất cứ khi nào bạn muốn.

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