C++ Class Prototyping
C++ Class Prototyping
我错过了什么吗?
class Foo;
class Bar {
public:
Foo foo;
};
class Foo { };
错误:错误C2079: 'Bar::foo'使用未定义的类' foo'
前向声明类时,可以创建指针和引用,但不能创建前向声明类类型的成员:需要Foo
的完整定义来决定外部类(即Bar
)的布局,否则编译器无法决定Bar
的大小和结构。
这是允许的:
class Foo;
class Bar {
public:
Foo* fooPtr;
Foo& fooRef;
};
允许前向声明类的指针和引用的原因是,指针和引用的大小不依赖于它们所指向(或引用)的类的结构。
是的,你错过了一些重要的东西:一个问题。
我假设你想知道代码中哪里出了问题,以及为什么编译器会发出错误。
编译器必须知道Foo的大小才能计算类Bar的布局。Foo对象的大小由它们的布局决定,要知道布局,编译器必须知道类的定义。在声明成员变量foo时,它只知道foo存在,而不知道它的大小,因为您之前只给了它一个声明,而不是定义。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符
- C++ Class Prototyping