gpt4 book ai didi

c++ - 循环文件包含C++

转载 作者:行者123 更新时间:2023-12-01 14:43:11 25 4
gpt4 key购买 nike

假设我们有两个类:

// Object.hpp
class Object
{
Handler* h;

Object();
void method();
};

// Object.cpp
Object::Object()
{
h = new Handler();
}

// Handler.hpp
class Handler
{
void update(Object*);
};

// Handler.cpp
void Handler::update(Object* o)
{
o->method();
}

如何链接四个文件而不会出现包含错误?我尝试了所有可以想到的方法以及可以在网上找到的所有方法。

在两个文件中添加 #include将导致此错误:
Handler.hpp: error: ‘Object’ has not been declared
update(Object*);
^

如果我在处理程序中添加对象的前向声明,则会得到以下信息:
Object.hpp: error: ‘Handler’ does not name a type
Handler handler

在Handler.hpp中包含Object并在Object.hpp中向前声明Handler可以达到以下目的:
Object.hpp: error: field ‘h’ has incomplete type ‘Handler’
Handler handler;
^

同时,在Object.hpp中包括Handler,在Handler.hpp中向前声明Object可以做到这一点:
Handler.cpp: error: invalid use of incomplete type ‘class Object’
o->method();
^

我似乎无法弄清楚彼此包含文件的方式。此结构基于 Robert Nystrom's Game Programming Patterns的去耦组件模式。任何帮助表示赞赏。谢谢

最佳答案

您发布的错误似乎并非来自您提供的代码。

问题所在

Object.hpp: error: ‘Handler’ does not name a type
Handler handler //<-- Declaration of object of type Handler, not pointer

handler被声明为对象,而不是指针。因此,编译器需要知道定义。因此,仅进行前向声明是不够的。如果在给定的Object.hpp中添加Handler的前向声明,则它应该可以工作:
// Object.hpp
//forward-declaration of Handler
class Handler;

class Object
{
Handler* h;

Object();
void method();
};
// Object.cpp
//include Handler.hpp

#include "Handler.hpp"
Object::Object()
{
h = new Handler();
}
// Handler.hpp
//include Object.hpp

#include "Object.hpp"

class Handler
{
void update(Object*);
};
// Handler.cpp
void Handler::update(Object* o)
{
o->method();
}

编辑以在Object.cpp中添加include并根据@TonyK的注释删除第一段

关于c++ - 循环文件包含C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60973434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com