2016-08-02 15 views
5

Tôi cần trì hoãn cuộc gọi hàm tạo, vì vậy tôi có thể khởi tạo giá trị cần được truyền cho hàm tạo. Tôi đã viết một ví dụ ngắn và rất đơn giản.Gọi hàm tạo trễ

class A 
{ 
private: 
    ObjectA* _ptr; 

public: 
    A(ObjectA*); 
}; 

class B 
{ 
private: 
    A object;  // The constructor seems to be called here? 
    ObjectA* obj; 

public: 
    B(); 
}; 

A::A(ObjectA* ptr) 
{ 
    this->_ptr = ptr; 
} 

B::B() 
{ 
    obj = new ObjectA(); 
    object(obj); // I want to call the 'A' constructor here, after initializing of 'obj'. 
} 

Có thể không?

+0

Tạo 'A' động trong hàm tạo' B' và lưu con trỏ vào đó. – Ari0nhh

+3

Đối với C++ 17, sử dụng ['std :: optional'] (http://en.cppreference.com/w/cpp/utility/optional). Hoặc chỉ cần cải thiện thiết kế của bạn. – StoryTeller

+0

Tại sao bạn không thể trì hoãn việc tạo đối tượng cho đến khi giá trị được sử dụng để xây dựng nó được khởi tạo? Nó không phải là nó thường là hợp lý để tạo ra một đối tượng và sau đó sử dụng nó trước khi nó được khởi tạo đúng. – Peter

Trả lời

15

Không, bạn không thể trì hoãn việc xây dựng thành viên giá trị. Bạn có thể sử dụng một con trỏ thay vì một giá trị trực tiếp nhưng đó không phải là giải pháp cho vấn đề của bạn.

Các giải pháp thích hợp cho vấn đề của bạn đang sử dụng initialization list:

B::B () : obj(new ObjectA), object(obj) {} 

Ngoài ra, bạn cần phải đặt obj trước object trong class B:

class B 
{ 
     private: 
       ObjectA *obj; 
       A  object; 

     public: 
       B (); 
} 

Lý do cho điều này là, khi một constructor được gọi, tất cả các thành viên đối tượng phải được xây dựng và khởi tạo đúng cách. Điều này được thực hiện bằng cách sử dụng hàm tạo mặc định của chúng.

Lý do sắp xếp lại các thành viên của lớp là các khởi tạo của các thành viên được gọi theo thứ tự chúng được khai báo trong lớp không theo thứ tự xuất hiện của chúng trong danh sách khởi tạo.

+1

Tôi rất muốn giới thiệu OP sử dụng 'std :: unique_ptr'. Bằng cách đó, anh không cần phải lo lắng về việc quản lý bộ nhớ. –

+1

@MartinBonner, cho 'obj' tất nhiên, buf đó là một chủ đề khác. –

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