向前申报的问题

Forward Declaration issue

本文关键字:问题      更新时间:2023-10-16

我目前遇到了一种我不理解的情况,如果有人能向我解释为什么会发生这种情况以及我如何解决它,我会很感激。假设我有两个头文件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行得到一个错误,说它不识别客户端类。但是,如果我将枚举从订单类移动到客户端类这样,使用Client::OrderType访问enum,然后我没有得到错误。这里发生了什么,关于如何解决这个问题,我的头警卫工作有什么建议吗?

客户端和订单之间存在循环依赖关系。最好是尽量避免。但是如果你需要的话,你可以转发声明你的类(和模板),并使用指向它们的引用和指针。这些类不能使用,因为它们是不完整的。

#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相同。你应该注意,你的方法声明必须从传递Client改为传递Client const&,因为你不能在你的接口中使用不完整的Client类型。Client&, Client*, std::shared_ptr<Client>及其变体为完整类型

在你的实现文件中,你可以包括所有的头文件,你的类型是完整的,你可以使用它们。

这是因为当编译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

"