【问题标题】:How to implement association in c++如何在 C++ 中实现关联
【发布时间】:2013-10-13 02:31:36
【问题描述】:

我想实现关联 I C++,但我遇到了几个错误,我无法解决它们。

Class A{

public: //methods
private:
B * b_obj;

};

Class B{
public: //methods
private:
A * a_obj;
}

这两个类都在不同的文件中。即A.hA.cppB.hB.cpp。 VS2012 报错 错误 C2061:A 附近的语法错误

【问题讨论】:

    标签: c++ aggregation composition model-associations cross-reference


    【解决方案1】:

    您需要前向声明类:

    啊哈:

    class B;
    
    class A {
        public:
            // methods
        private:
            B* b_obj;
    };
    

    B.h

    class A;
    
    class B {
        public: 
            // methods
        private:
            A* a_obj;
    };
    

    【讨论】:

    • 我必须在 B 和 A 的 .h 文件中分别执行 #include "A" 和 #include "B" 吗?
    • @FarazAhmad:不。使用前向声明的目的是避免包含整个头文件。
    【解决方案2】:

    可以通过多种方式处理这种特殊的交叉引用情况。

    假设您不能只让 Ah 包含 Bh 和 Bh 包含 Ah,因为当最多包含一次标头时,一个总是在另一个之前包含,最简单的解决方案就是使用 forward references

    啊.h

    class B;
    
    class A {
      B* bObj;
    }
    

    A.cpp

    #include "A.h"
    #include "B.h"
    
    ...
    

    B.h

    class A;
    
    class B {
     A* aObjM;
    }
    

    B.cpp

    #include "B.h"
    #include "A.h"
    
    ...
    

    这个简单的解决方案不允许您在 B.h 中使用 A 规范(例如调用方法),反之亦然,也不允许您将具体实例(AA*)存储在B 类,但听起来不像你的情况。

    【讨论】:

    • 我必须在 B 和 A 的 .h 文件中分别执行 #include "A" 和 #include "B" 吗?
    • 不,您只需将它们包含在源 .cpp 文件中,这是因为您转发声明了该类。所以编译器在检查B.h 时知道类A 存在。 A 的每个功能都是未知的(甚至是大小!),因此您不能直接在 B.h 中使用该信息,但您可以在 B.cpp 中包含 A.h
    【解决方案3】:

    您对每个文件都有哪些包含语句?从您在这里看到的情况来看,前向声明似乎对您有用。

    // A.h
    #includes without B.h
    
    class B;
    
    class A {
        public:
             // whatever
    
        private:
            B * b_obj;
    };
    
    // B.h
    #includes without A.h
    
    class A;
    
    class B {
        public:
             // whatever
    
        private:
            A *a_obj;
    };
    

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多