c++ - 带有类类型 vector 的前向声明 - 不允许指向不完整类类型的指针

标签 c++ circular-dependency forward-declaration

我有两个类,foobar

foo.h #includes bar.h 并包含指向 bar 对象的指针的 std::vector。在运行时的某个时刻,bar 必须访问这个指向其他 bar 对象的指针 vector 。因此,foo 包含一个名为 getBarObjects() 的方法,该方法返回指针数组。

因此,我在 bar.h 中转发声明 foo。显然,我还必须转发声明我正在使用的方法 - foo::getBarObjects()。由于这会返回指向 bar 的指针数组,因此我陷入了恶性循环。

我不能转发声明 Bar 然后简单地转发声明 getBarObjects(),因为这会导致“不允许不完整的类型名称”。

foo.h:

#include "bar.h"
#include <vector>

class foo {
    public:
         foo();
         ~foo();
         std::vector<bar*> getBarObjects();
    private:
         std::vector<bar*> barObjects;
}

bar.h:

class foo;
std::vector<bar*> foo::getBarObjects();        // error, doesn't know bar at this point

class bar {
    public:
        bar(foo *currentFoo);
        ~bar();
        bool dosth();
    private:
        foo *thisFoo;
}

bar.cpp:

#include "bar.h"

bool bar(foo *currentFoo) {
    thisFoo = currentFoo;
}

bool bar::dosth() {
    thisFoo->getBarObjects();        // error, pointer to inomplete class type is not allowed
}

如果我简单地包含另一种方式,稍后我将在 foo 中遇到同样的问题。有什么建议吗?

最佳答案

您不能转发声明成员。

相反,bar.cpp 应该#include foo.hbar.h。问题解决了。

一般来说,如果你使用序列:

  • 转发声明所有类类型
  • 定义所有类类型
  • 类(class)成员

一切都会好的。

关于c++ - 带有类类型 vector 的前向声明 - 不允许指向不完整类类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714345/

相关文章:

c++ - 浮点类型表示

python - ImportError : Model A references Model B, 模型 B 引用模型 A

c++ - 如何在控制台应用程序的 mini2440 屏幕上打印我的应用程序的输出?

使用变量的 C++ 文件命名

c++ - 调试错误,在c++中调用了abort()

javascript - 检测到循环依赖项中的警告 : barrelsby Angular 10

python - 循环导入Python

c++ - CRTP - 嵌套叶类类型的可见性

c++ - 返回类型不完整的调用方法和我无法解释的模板解决方法

c++ - 在一个 header 和一个 namespace 中堆叠多个前向声明