C++ C++;成员相互引用的类
我试着写两个成员相互引用的类。我不确定我是做错了什么,还是根本不可能。有人能帮我吗 Source.cppC++ 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
#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
参考classRouter
中的矢量内容和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保护的公共头文件。至于远期减赤,这对我来说是有效的。谢谢你的帮助!