声明创建该类甚至前一个对象(Declare an object even before that c

2019-07-30 06:14发布

反正在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