甚至在创建该类之前声明一个对象

时间:2008-09-22 06:04:39

标签: c++ class object instantiation

在使用C ++创建类之前,是否要声明类的对象?我问,因为我试图使用两个类,第一个需要在其中包含第二个类的实例,但第二个类还包含第一个类的实例。我意识到你可能会认为我可能进入一个无限循环,但实际上我需要在第一个类之前创建第二个类的实例。

5 个答案:

答案 0 :(得分:39)

你做不到这样的事情:

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类声明为前向声明允许您使用指向该类的指针(和引用),而无需具有完整的类定义。

答案 1 :(得分:5)

您不能声明未定义类的实例,但可以将指针声明为一个:

class A;  // Declare that we have a class A without defining it yet.

class B
{
public:
    A *itemA;
};

class A
{
public:
    B *itemB;
};

答案 2 :(得分:2)

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类都已经存在   完全宣布。这就是魔力   这种方法。

答案 3 :(得分:0)

这是否接近你想要的:第一个类包含第二个类,但是第二个类(首先要创建)只是引用了第一个类?

答案 4 :(得分:0)

这称为交叉引用。请参阅here示例。