反正在C ++创建类之前声明一个类的对象? 我问,因为我想用两个班,首先需要在它有第二类的实例,但第二类还包含第一类的一个实例。 我知道你可能会想我可能会进入一个无限循环,但我确实需要一流之前创建与第二类的实例。
Answer 1:
你不能做这样的事情:
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类为向前声明允许您使用指针(和引用)的那类,但仍未有全班的定义。
Answer 2:
你不能声明一个未定义的类的实例,但你可以声明一个指针之一:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Answer 3:
有一个优雅的解决方案使用的模板。
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 BA::getB() { return A(); } inline AB::getA() { return B(); }
此代码将工作! 那么,为什么它的工作原理? 原因与模板编译如何做。 模板延迟功能签名的创建,直到你实际使用模板的地方。 这意味着,既不木屐(),也不getB()将有他们的签名分析,直到两个类A后和B已经完全申报。 这是这种方法的魔力。
Answer 4:
这是接近你想要的东西:第一类包含第二类,但第二类(也就是要创建第一)只是要在第一类的引用?
Answer 5:
这就是所谓的交叉引用。 见这里的例子。
文章来源: Declare an object even before that class is created