【问题标题】:C++ classes with members referencing each other成员相互引用的 C++ 类
【发布时间】:2011-11-15 17:42:44
【问题描述】:

我正在尝试使用相互引用的成员编写 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。

我很确定我没有遗漏任何分号或类似的东西。如果我取出其中一名成员,该程序将起作用。我尝试找到类似的问题,解决方案是使用指针,但这就是我正在做的,它似乎没有工作!

【问题讨论】:

  • 你有两个文件试图#include 彼此,这不好......
  • 附注 - 您需要在头文件中为向量指定命名空间 (std:vector &lt;Router&gt;)

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


【解决方案1】:

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

std::vector<Router> Routers;

不要“使用命名空间标准;”在头文件中

其他错误是由第一个错误引起的:)

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

class Router;

进入您的 Network.h

【讨论】:

  • 我把vector成员拿出来改成Router* router;,在Headers.h中添加了前向减法。但仍然没有运气。
  • 谢谢,您的固定答案为我解决了问题。我需要在 Network.h 而不是 Headers.h 中添加前向声明。感谢您的帮助!
  • 您需要Router 的完整定义才能定义std::vector&lt;Router&gt;。但是,Router.h 中的 Network 的前向定义是合适的。
【解决方案2】:
  1. 使用include guards
  2. 使用Forward declaration

例如

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

【讨论】:

  • 谢谢,我之前尝试过包含防护。他们没有工作,所以我使用了一个包含保护的通用头文件。至于前向减速,这对我有用。感谢您的帮助!
【解决方案3】:

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

std::vector<Router> Routers;

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

【讨论】:

  • 请不要在头文件中使用using namespace std尤其是,因为它会污染包含它的任何其他文件。
  • @TheBuzzSaw 我在你发帖之前就发现了,但这并没有解决我的问题。我尝试将成员更改为Router* router;,但它仍然不起作用。同样的错误。
  • @Peter 我并不是暗示他应该把它放在头文件中。
  • @SaadImran。查看其他答案。您试图让两个头文件相互包含。先解决这个问题。
  • @TheBuzzSaw 我得到了为我工作的权利。但是,我看不到两个头文件是如何相互包含的,很想知道。你能给我指出来吗?谢谢。
【解决方案4】:

编译问题:

  1. 请在 Network.h 中的向量前添加 std::

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


循环引用:

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

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

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

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

    类网络;

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

    #include "Router.h"

    #include "Network.h"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2019-05-03
    • 2014-04-24
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多