我目前遇到了一个我不理解的情况,如果有人能向我解释为什么会发生这种情况以及我如何解决它,我会很感激。
假设我有两个头文件Client.h
和Order.h
,分别是Client和Order类。这是一个概述
FileName:Order.h
#ifndef Order_Header
#define Order_Header
.....
#include "Client.h"
class Order
{
public:
enum OrderType{open,close};
Client db; // ---> Line A
};
#endif
FileName:Client.h
#ifndef Client_Header
#define Client_Header
.....
#include "Order.h"
class Client
{
public:
void someMethod(Order::OrderType e);
};
#endif
现在,如果这个项目被编译,我在A行收到一个错误,说它无法识别客户端类。但是,如果我将枚举从Order Class移动到Client类
这样使用Client::OrderType
访问枚举然后我没有错误。这里发生了什么关于如何解决这个问题的建议不是我的头卫工作吗?
答案 0 :(得分:2)
您在客户和订单之间存在循环依赖关系。最好尽量避免它。但是如果你需要它,你可以转发声明你的类(和模板)并使用引用和指针。这些类不能使用,因为它们不完整。
#ifndef Order_Header
#define Order_Header
class Client; // forward declaration
class Order
{
public:
enum OrderType{open,close};
// the following declarations work:
Client* db_1;
Client& db_2;
std::shared_ptr<Client> db_3;
// the following declaration does not work, because of incomplete type
Client db_4;
};
#endif
与Client.h
相同。您应该注意,由于您无法在界面中使用incomplite类型Client
,因此必须将方法声明从Client const&
传递到Client
。 Client&
,Client*
,std::shared_ptr<Client>
和变体是完整类型。
在您的实施文件中,您可以包含所有标题,并且您的类型已完整,您可以使用它们。
答案 1 :(得分:1)
当编译Order.h文件时,他首先进入#include“Client.h”,它在Order.h之前编译,当他到达void someMethod(Order::OrderType e);
时没有定义订单。要解决它,请尝试
#ifndef Order_Header
#define Order_Header
.....
// #include "Client.h" Put it only on your cpp file
Class Client;
Class Order
{
public:
enum OrderType{open,close};
Client db; ---> Line A
}
#endif
FileName:Client.h
#ifndef Client_Header
#define Client_Header
.....
#include "Order.h"
Class Client
{
public:
void someMethod(Order::OrderType e);
}
#endif
`