前瞻声明问题

时间:2013-06-07 07:59:40

标签: c++

我目前遇到了一个我不理解的情况,如果有人能向我解释为什么会发生这种情况以及我如何解决它,我会很感激。 假设我有两个头文件Client.hOrder.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访问枚举然后我没有错误。这里发生了什么关于如何解决这个问题的建议不是我的头卫工作吗?

2 个答案:

答案 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&传递到ClientClient&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

`