【发布时间】:2010-09-11 22:04:31
【问题描述】:
在 C++ 中创建类之前,是否需要声明一个类的对象?我问是因为我正在尝试使用两个类,第一个类需要在其中包含第二个类的实例,但第二个类也包含第一个类的实例。我意识到您可能认为我可能会陷入无限循环,但实际上我需要在第一个类之前创建第二个类的实例。
【问题讨论】:
标签: c++ class object instantiation
在 C++ 中创建类之前,是否需要声明一个类的对象?我问是因为我正在尝试使用两个类,第一个类需要在其中包含第二个类的实例,但第二个类也包含第一个类的实例。我意识到您可能认为我可能会陷入无限循环,但实际上我需要在第一个类之前创建第二个类的实例。
【问题讨论】:
标签: c++ class object instantiation
你不能这样做:
class A {
B b;
};
class B {
A a;
};
最明显的问题是编译器不知道生成类 A 需要多大,因为 B 的大小取决于 A 的大小!
但是,您可以这样做:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
将类 B 声明为前向声明允许您使用指向该类的指针(和引用),而无需完整的类定义。
【讨论】:
你不能声明一个未定义类的实例,但你可以声明一个指针指向一个:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
【讨论】:
有an elegant solution 使用模板。
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(); }此代码将起作用!那么,为什么会这样 工作?原因与如何 模板被编译。模板 延迟函数的创建 签名,直到您实际使用 模板某处。这意味着 getA() 和 getB() 都不会 他们的签名被分析到之后 A 类和 B 类都已经 完全宣布。这就是魔力 这个方法。
【讨论】:
这是否接近您想要的:第一个类包含第二个类,但第二个类(即首先创建的)只是对第一个类的引用?
【讨论】:
这称为交叉引用。请参阅here 示例。
【讨论】: