成员互相引用的C ++类

时间:2011-11-15 17:42:45

标签: c++ pointers c-preprocessor class-design

我正在尝试用相互引用的成员编写2个类。我不确定我做错了什么,或者说这是不可能的。任何人都可以帮助我...

Source.cpp

#include "Headers.h"
using namespace std;

void main()
{
    Network* network = new Network();

    system("pause");
    return;
}

Headers.h

#ifndef Headers_h
#define Headers_h

#include <iostream>
#include <vector>
#include "Network.h"
#include "Router.h"

#endif

Network.h

#include "Headers.h"

class Network
{
protected:
    vector<Router> Routers;
};

Router.h

#include "Headers.h"

class Router
{
protected:
    Network* network;
public:
};

我得到的错误是:

  

错误C2143:语法错误:缺少';'在'&lt;'之前       错误C2238:';'之前的意外标记       错误C4430:缺少类型说明符 - 假定为int。

我很确定我没有丢失任何分号或类似的东西。该程序可以找到我是否取出其中一个成员。我尝试找到类似的问题,解决方案是使用指针,但这就是我正在做的事情,它似乎并没有起作用!

4 个答案:

答案 0 :(得分:4)

  1. 使用include guards
  2. 使用Forward declaration
  3. E.g。

    <强> Source.cpp

    #include "Network.h"
    // using namespace std; // bad idea unless it's a quickie test program
    
    void main()
    {
        Network* network = new Network();
    
        system("pause");
        return;
    }
    

    <强> Network.h         #ifndef MY_NETWORK_H_INCLUDED         #define MY_NETWORK_H_INCLUDED

    #include "Router.h"
    #include <vector>
    using std::vector;
    // even better is:
    //     typedef std::vector<Router> t_RouterVec;
    //     t_RouterVec routers;
    
    class Network
    {
    protected:
        vector<Router> Routers;
    };
    
        #endif // MY_NETWORK_H_INCLUDED
    

    <强> Router.h

    #ifndef MY_ROUTER_H_INCLUDED
    #define MY_ROUTER_H_INCLUDED
        class Network;
    class Router
    {
    protected:
        Network* network;
    public:
    };
    
        #endif MY_ROUTER_H_INCLUDED
    

    非常糟糕的想法 我认为这是一种气味。你让每个人都包括一切。现在,每次在Network.h或Router.h中更改内容时,都必须重新编译(并且最好重新测试)所有内容!

    #ifndef Headers_h
    #define Headers_h
    
    #include <iostream>
    #include <vector>
    #include "Network.h"
    #include "Router.h"
    
    #endif
    

答案 1 :(得分:4)

第一个错误 - 您需要显式使用命名空间:

std::vector<Router> Routers;

不要“使用namespace std;”在头文件中

其他错误源自第一个:)

对于后面定义的类的引用,你需要做Router类的前向声明,把

class Router;

进入您的Network.h

答案 2 :(得分:1)

您需要在向量前添加std::前缀。您的另一个选择是将using namespace std;放在该文件的顶部。

std::vector<Router> Routers;

using namespace std;
...
vector<Router> Routers;

答案 3 :(得分:0)

编译问题:

  1. 请在Network.h中添加std :: before

  2. 请根据标准更正main返回一个整数。


  3. 循环参考:

    Network.h引用类Router作为其向量内容和Router.h引用 班Network。这是鸡蛋和鸡蛋的情景。你不能兼得:)。

    要解决此问题,我建议如下:

    1. 在Router.h中添加一个不透明的类引用网络。

      由于Router.h使用指向网络的指针,因此无需了解网络的详细信息,只需要知道网络是一个类。

      类网络;

    2. Headers.h中包含指令的顺序更改为

      #include“Router.h”

      #include“Network.h”