我有两个类,foo
和 bar
。
foo.h #include
s 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.h
和 bar.h
。问题解决了。
一般来说,如果你使用序列:
- 转发声明所有类类型
- 定义所有类类型
- 类(class)成员
一切都会好的。
关于c++ - 带有类类型 vector 的前向声明 - 不允许指向不完整类类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714345/