C++创建双向链接类

use*_*248 1 c++ pointers class

我有两个类,它们都需要链接到彼此的对象.这是一些显示我的问题的示例代码:

//object1.h
class object1{
    object2 *pointer;
}
Run Code Online (Sandbox Code Playgroud)

我的另一课:

//object2.h
class object2{
    object1 *pointer;
}
Run Code Online (Sandbox Code Playgroud)

我不确定我应该如何在彼此的文件中同时包含这两个类.在两个文件中包含其他类的包含会导致我出现问题.最好,我想将这两个对象放在一个文件中,因为它们的标题每行只有几行代码,但是这会导致在文件中首次声明的类中出现错误,因为其他类标题不是在它之前; 它给了我一个无效的类型错误.

aka*_*ppa 8

使用前瞻声明:

//object1.h
class object2;
class object1{
    object2 *pointer;
};

//object2.h
class object1;
class object2{
    object1 *pointer;
};
Run Code Online (Sandbox Code Playgroud)

前向声明引入了不完整的类型.简而言之,它告诉编译器该定义存在于其他地方.但是,对于不完整类型,您有一些限制.由于编译器不知道它的完整定义,因此无法为其分配足够的空间,调用成员函数,检查虚拟表等等.从根本上说,你可以做的只是声明引用/指向它们并传递他们周围:

// Forward declaration
class X;

class Y {
private:
//  X x;    // Error: compiler can't figure out its size
    X &x;    // A reference is ok
public:
    Y(X &x) : x(x) { }

//  void foo() { x.foo(); } // Error: compiler can't invoke X's member
    void bar();
};

// Full declaration
class X {
public:
    void foo() { }
};

void Y::bar()
{
    x.foo(); // Now it is OK to invoke X's member
}
Run Code Online (Sandbox Code Playgroud)

一个好的模式是使用前向声明来打破标题或类定义之间的依赖循环,让你想知道你的设计可以改进什么.