如何访问转发声明类的成员

How to access members of forward declared class

本文关键字:声明 成员 转发 何访问 访问      更新时间:2023-10-16

我正在尝试弄清楚如何通过指针访问前向声明的类的成员变量。

我的代码:

#include <iostream>
class Boo;
class Foo{
public:
int getNum() {
return booPtr->num; //Error: Member access into incomplete type 'Boo'
}
Boo *booPtr;
};
class Boo : public Foo {
public:
Boo() {
booPtr = this;
}
int num = 45;
};
int main() {
Boo boo;
int num = boo.getNum();
std::cout <<  num << 'n';
}

我得到的错误:

"return booPtr->num":成员访问不完整的类型"Boo">

我期望的结果:

45

如何修复此错误,以及实现相同目标的更常见和更安全的方法是什么?

当您访问类的成员时,该类必须是完整类型;只有前向声明是不够的。

您可以将成员函数的定义移出类定义,移到Boo的定义之后。

class Boo;
class Foo{
public:
int getNum();
Boo *booPtr;
};
class Boo : public Foo {
...
};
int Foo::getNum() {
return booPtr->num;
}

您需要定义成员函数getNum()编译器知道类型Boo。因此,将Foo的类定义更改为

class Boo;
class Foo{
public:
int getNum();
Boo *booPtr;
};

然后是Boo的定义,最后是

int Foo::getNum()
{
return booPtr->num;
}