Có cách nào để khai báo một đối tượng của một lớp trước khi lớp được tạo trong C++ không? Tôi hỏi vì tôi đang cố gắng sử dụng hai lớp, đầu tiên cần phải có một thể hiện của lớp thứ hai bên trong nó, nhưng lớp thứ hai cũng chứa một thể hiện của lớp đầu tiên. Tôi nhận ra rằng bạn có thể nghĩ rằng tôi có thể nhận được vào một vòng lặp vô hạn, nhưng tôi thực sự cần phải tạo và dụ của lớp thứ hai trước khi lớp đầu tiên.Khai báo một đối tượng ngay cả trước khi lớp đó được tạo ra
Trả lời
Bạn không thể làm một cái gì đó như thế này:
class A {
B b;
};
class B {
A a;
};
Vấn đề rõ ràng nhất là trình biên dịch không biết làm thế nào để lớn nó cần phải làm cho lớp A, vì kích thước của B phụ thuộc vào kích thước của A!
Bạn có thể, tuy nhiên, làm được điều này:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Tuyên bố lớp B như một lời tuyên bố về phía trước cho phép bạn sử dụng con trỏ (và tài liệu tham khảo) đến lớp mà không chưa có định nghĩa cả lớp.
Bạn không thể khai báo một thể hiện của một lớp học không xác định nhưng bạn có thể khai báo một con trỏ một:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Đây có phải là gần với những gì bạn muốn: Lớp đầu tiên chứa lớp thứ hai, nhưng lớp thứ hai (được tạo ra trước) chỉ có một tham chiếu đến lớp đầu tiên?
Tôi đang thực sự cố gắng làm ngược lại, trong đó lớp đầu tiên tham chiếu đến lớp thứ hai và lớp thứ hai chứa một phiên bản của lớp đầu tiên. –
Đây được gọi là tham chiếu chéo. Xem here một ví dụ.
Có an elegant solution sử dụng mẫu.
template< int T > class BaseTemplate {}; typedef BaseTemplate<0> A; typedef BaseTemplate<1> B; // A template<> class BaseTemplate<0> { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate<1> { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Mã này sẽ hoạt động! Vì vậy, tại sao nó hoạt động? Lý do phải làm với cách thức biên soạn các mẫu . Mẫu trì hoãn việc tạo hàm chữ ký cho đến khi bạn thực sự sử dụng mẫu ở đâu đó. Điều này có nghĩa là không getA() và getB() sẽ có chữ ký của chúng được phân tích cho đến sau cả hai lớp A và B đã được khai báo đầy đủ . Đó là sự kỳ diệu của phương pháp này.
Thú vị (mặc dù nó có nhiều lỗi chính tả). Nhưng 'getA' và 'getB' thực sự là các nhà máy: họ trả lại các phiên bản mới (theo giá trị). Một thể hiện của A không có B cũng như một cá thể B có A. – jwfearn
- 1. JPA EntityManager persist() khiến đối tượng xuất hiện tách ra ngay cả khi lỗi được ném
- 2. Cách gọi thành viên trước khi khai báo đối tượng được hoàn thành
- 3. Khởi tạo đối tượng của một lớp trước khi hàm main() thực hiện
- 4. Đối tượng được tạo bên trong phạm vi được deallocated ngay cả khi được sử dụng ngoài phạm vi
- 5. Tại sao lớp HttpServlet được khai báo là trừu tượng?
- 6. Khai báo đối tượng lớp trong tệp tiêu đề
- 7. khai báo thuộc tính làm đối tượng?
- 8. PHP: đối tượng là NULL ngay sau khi tạo
- 9. CloneNotSupportedException ngay cả khi triển khai Cloneable
- 10. Lỗi khởi tạo tĩnh nếu được đặt trước khai báo
- 11. HTML5 Xóa đối tượng được vẽ trước đó trong canvas
- 12. TextWatcher được gọi ngay cả khi văn bản được đặt trước khi thêm người theo dõi
- 13. Tại sao hàm tạo không được gọi khi() được sử dụng để khai báo một đối tượng?
- 14. Trình tạo ID cho các đối tượng được tạo ra
- 15. Buộc json đổ một đối tượng json ngay cả khi danh sách trống rỗng
- 16. Khai báo mảng đối tượng chứa đối tượng
- 17. Khai báo một đối tượng dễ bay hơi
- 18. Có tệ không khi khai báo một lớp học trống?
- 19. Thu gom rác của đối tượng C# được khai báo trong hàm dựng
- 20. Thực hiện ngay tất cả các lớp đang triển khai một giao diện cụ thể
- 21. NoClassDefFoundError javax/jms/Thông báo ngay cả khi chỉ định đường dẫn lớp
- 22. Khi nào Spring tạo ra các đối tượng của các đối tượng được tiêm
- 23. ứng dụng: didFinishLaunchingWithOptions: thông báo kích hoạt trước khi bộ điều khiển đích được tạo ra
- 24. Có thể tạo đối tượng mà không khai báo lớp không?
- 25. Trình nghe sự kiện cục bộ được gọi ngay cả khi đối tượng không được xây dựng
- 26. tên 'thời gian' được sử dụng trước khi khai báo toàn cầu - Nhưng IT IS được khai báo!
- 27. cmake tạo ra một đối tượng chia sẻ
- 28. Khai báo lớp PHP
- 29. Tạo đối tượng trong bộ nhớ được phân bổ trước
- 30. khai báo lớp trừu tượng trong C++
... hoặc tham chiếu đến một: MyClass & rMyObject; –