C++ 循环文件包含C++;

C++ 循环文件包含C++;,c++,circular-dependency,C++,Circular Dependency,假设我们有两个班: //Object.hpp 类对象 { 处理器*h; 对象(); void方法(); }; //Object.cpp 对象::对象() { h=新处理程序(); } //Handler.hpp 类处理程序 { 无效更新(对象*); }; //Handler.cpp 无效处理程序::更新(对象*o) { o->method(); } 如何链接这四个文件而不出现包含错误?我已经尝试了所有我能想到的方法,我可以在网上找到 在两个文件中添加#include将导致此错误: Handl

假设我们有两个班:

//Object.hpp
类对象
{
处理器*h;
对象();
void方法();
};
//Object.cpp
对象::对象()
{
h=新处理程序();
}
//Handler.hpp
类处理程序
{
无效更新(对象*);
};
//Handler.cpp
无效处理程序::更新(对象*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.hpp中向前声明处理程序,可实现以下功能:

Object.hpp: error: field ‘h’ has incomplete type ‘Handler’
         Handler handler;
                 ^
Handler.cpp: error: invalid use of incomplete type ‘class Object’
     o->method();
      ^
同时,将Handler包含在Object.hpp中,Handler.hpp中的前向声明对象将提供以下功能:

Object.hpp: error: field ‘h’ has incomplete type ‘Handler’
         Handler handler;
                 ^
Handler.cpp: error: invalid use of incomplete type ‘class Object’
     o->method();
      ^

我似乎不知道如何将这些文件相互包含。此结构基于与的解耦组件模式。感谢您的帮助。谢谢

您发布的错误似乎不是来自您提供的代码

问题在于

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

编辑以添加include in Object.cpp并根据@TonyK的评论删除第一段

发现问题。感谢大家抽出时间来帮助我,特别感谢@Yksisarvinen提供的有用链接

问题是我将#include放在了.hpp文件中,这给编译器带来了问题,尽管我有include保护

我解决了这个问题,只在.hpp文件中使用了向前声明,这些文件不需要包含类中的任何代码,然后将#include添加到.cpp文件中(我使用包含类中的方法)

基本上,我做了以下工作:

  • 我在Object.hpp中添加了一个#include“Handler.hpp”(对象类包含一个Handler对象,它调用需要#include的构造函数)
  • 我只在Handler.hpp中添加了一个对象的前向声明(Handler.hpp不需要对象文件中的任何代码,它只需要知道存在一个对象类)
  • 最后,我在Handler.cpp中添加了#include“Object.hpp”(这是必需的,因为我使用了Object中的方法)

您知道可以在不定义类的情况下声明类吗?类对象;这回答了你的问题吗?使用转发声明的两种方法都可以。请提供一个是的,我已经尝试过了,正如我在问题中提到的-我已经尝试过转发声明它们,并且得到了我发布的错误。错误指的是示例中不存在的代码。Forward declaratiosn允许您拥有指针和引用,但不能将对象作为Members,为了完整性,在这个简单的例子中,问题也可以通过
类处理程序*h解决
对象的定义内
+1.您的第一段是错误的:您不必在函数声明中命名参数。是的,我不需要在.hpp中命名参数。您的第二段内容正确,但添加了一个#include the.hpp也会给出一个错误。代码是正确的,问题是其中一个include必须放在.cpp文件中。检查我的answer@korajkoTrue,编辑为将Handler.hpp包含在Object.cpp中
// Handler.hpp
//include Object.hpp

#include "Object.hpp"

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