具有相互引用成员的c++类

C++ classes with members referencing each other

本文关键字:c++ 成员 引用      更新时间:2023-10-16

我正试图编写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:语法错误:在'<'之前缺少';'
错误C2238:在';'前面的意外标记
错误C4430:缺少类型说明符-假设为int。

我很确定我没有漏掉任何分号或类似的东西。如果我取出其中一个成员,程序就会运行。我试着找到类似的问题和解决方案是使用指针,但这就是我正在做的,它似乎不工作!

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

std::vector<Router> Routers;

不要在头文件中"使用命名空间std;"

其他错误来自于第一个:)

对于后面定义的类的引用,你需要做Router类的forward声明,put
class Router;
  1. 使用正向声明

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

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

std::vector<Router> Routers;

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

编译问题:

  1. 请在Network.h

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


循环引用:

Network.h引用了Router类的向量内容和Router.h引用Network类。这是一个先有鸡还是先有蛋的问题。你不能两者兼得:).

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

  1. 在Router.h.

    中添加不透明类引用Network

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

    类网络;

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

    # include"Router.h"

    # include"Network.h"