C++ C++;成员相互引用的类

C++ C++;成员相互引用的类,c++,pointers,c-preprocessor,class-design,C++,Pointers,C Preprocessor,Class Design,我试着写两个成员相互引用的类。我不确定我是做错了什么,还是根本不可能。有人能帮我吗 Source.cpp #include "Headers.h" using namespace std; void main() { Network* network = new Network(); system("pause"); return; } #include "Network.h" // using namespace std; // bad idea unless i

我试着写两个成员相互引用的类。我不确定我是做错了什么,还是根本不可能。有人能帮我吗

Source.cpp

#include "Headers.h"
using namespace std;

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

    system("pause");
    return;
}
#include "Network.h"
// using namespace std; // bad idea unless it's a quickie test program

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

    system("pause");
    return;
}
标题.h

#ifndef Headers_h
#define Headers_h

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

#endif
#include "Headers.h"

class Network
{
protected:
    vector<Router> Routers;
};
#include "Headers.h"

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

    #endif MY_ROUTER_H_INCLUDED
我得到的错误是:


错误C2143:语法错误:缺少“;”在“之前,需要在向量前面加上
std::
。您的另一个选择是使用名称空间std放置
位于该文件的顶部

std::vector<Router> Routers;
std::向量路由器;

使用名称空间std;
...
矢量路由器;
  • 使用
  • 使用
  • 例如

    Source.cpp

    #include "Headers.h"
    using namespace std;
    
    void main()
    {
        Network* network = new Network();
    
        system("pause");
        return;
    }
    
    #include "Network.h"
    // using namespace std; // bad idea unless it's a quickie test program
    
    void main()
    {
        Network* network = new Network();
    
        system("pause");
        return;
    }
    
    网络.h #如果包括我的网络 #定义我的网络,包括

    #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
    
    非常糟糕的主意 我认为这是一种气味。你让每个人都包括一切。现在,每当您更改Network.h或Router.h中的某些内容时,您必须重新编译(理想情况下重新测试)所有内容

    #ifndef Headers_h
    #define Headers_h
    
    #include <iostream>
    #include <vector>
    #include "Network.h"
    #include "Router.h"
    
    #endif
    
    \ifndef头文件
    #定义标题
    #包括
    #包括
    #包括“Network.h”
    #包括“Router.h”
    #恩迪夫
    
    第一个错误-您需要显式使用名称空间:

    std::vector<Router> Routers;
    

    进入您的网络。h

    编译问题:

  • 请在网络中的矢量之前添加std::h

  • 请按照标准更正main以返回整数


  • 循环引用:

    Network.h
    参考class
    Router
    中的矢量内容和Router.h参考 类
    网络
    。这是一个鸡生蛋的场景。不能两者都有:)

    为了解决这个问题,我建议如下:

  • 在Router.h中添加不透明的类引用网络

    由于
    Router.h
    使用指向网络的指针,它不需要知道网络的细节,只需要知道网络是一个类

    班级网络

  • Headers.h
    中include指令的顺序更改为

    #包括“Router.h”

    #包括“Network.h”


  • 您有两个文件试图#包含彼此,这不好…请注意-您需要在头文件中为向量指定命名空间(
    std:vector
    ),请不要使用
    使用命名空间std
    ,尤其是在头文件中,因为它会污染包含它的任何其他文件。@Buzzsaw我在你发布之前捕捉到了它,但这并没有解决我的问题。我尝试将成员更改为
    Router*Router但它仍然不起作用。同样的错误。@Peter I并不是暗示他应该把它放在头文件中。@SaadImran。请看其他答案。您正试图使两个头文件相互包含。“先解决这个问题。”我被解雇了,为我工作。然而,我看不出两个头文件是如何相互包含的,我很想知道。你能为我指出这一点吗?谢谢。我拿出vector成员并将其更改为
    Router*Router
    并在Headers.h中添加了前向偏差。但是还是不走运。谢谢,你的固定答案解决了我的问题。我需要在Network.h而不是Headers.h中添加前向偏差。谢谢你的帮助!为了定义一个
    std::vector
    ,您需要
    路由器的完整定义。不过,在
    Router.h
    中对
    网络
    进行正向定义是合适的。谢谢,我以前尝试过include-guard。它们不起作用,所以我使用了一个具有include保护的公共头文件。至于远期减赤,这对我来说是有效的。谢谢你的帮助!