【问题标题】:C++ creating doubly-linked classesC++ 创建双向链接的类
【发布时间】:2012-11-03 07:47:01
【问题描述】:

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

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

我的其他班级:

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

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

【问题讨论】:

    标签: c++ class pointers


    【解决方案1】:

    使用forward declaration

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

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

    // 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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多