0

我目前遇到了一种我不理解的情况,如果有人能向我解释为什么会发生这种情况以及我如何解决它,我将不胜感激。假设我有两个头文件Client.hOrder.h分别带有 Client 和 Order 类。这是一个概述

文件名:Order.h

#ifndef Order_Header
#define Order_Header
.....
#include "Client.h"
class Order
{
  public:
  enum OrderType{open,close};
  Client db; // ---> Line A
};
#endif

文件名:Client.h

#ifndef Client_Header
#define Client_Header
.....
#include "Order.h"
class Client
{
  public:
  void someMethod(Order::OrderType e);
};
#endif

现在,如果这个项目被编译,我在 A 行得到一个错误,说它不能识别客户端类。但是,如果我将枚举从 Order 类移动到 Client 类,以便使用枚举来访问,Client::OrderType那么我不会收到任何错误。这里发生了什么关于如何解决这个问题的任何建议,而不是我的头卫工作?

4

2 回答 2

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。您应该注意,您的方法声明必须从传递更改为ClientClient const&因为您不能在界面中使用不完整的类型ClientClient&, Client*,std::shared_ptr<Client>和变体是完整类型。

在您的实现文件中,您可以包含所有标头,并且您的类型是完整的,您可以使用它们。

于 2013-06-07T08:32:19.403 回答
1

这是因为当编译 Order.h 文件时,他首先转到#include "Client.h",它在 Order.h 之前编译它,并且当他到达 void someMethod(Order::OrderType e);Order 时没有定义。要解决它尝试

#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

文件名:Client.h

#ifndef Client_Header
#define Client_Header
.....
#include "Order.h"
Class Client
{
  public:
  void someMethod(Order::OrderType e);
}
#endif

`

于 2013-06-07T08:23:42.170 回答