向前申报的问题
Forward Declaration issue
本文关键字:问题 更新时间:2023-10-16
我目前遇到了一种我不理解的情况,如果有人能向我解释为什么会发生这种情况以及我如何解决它,我会很感激。假设我有两个头文件Client.h
和Order.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
"
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题