如何使用向前声明的类的成员函数
How can I use a member function of a forward declared class?
我有2类A和B类,以下4个文件:
A.H
#ifndef A_H
#define A_H
#include "B.h"
class A {
public:
A();
int functionA();
B objectB;
};
#endif //A_H
b.h
#ifndef B_H
#define B_H
class A;
class B {
public:
B();
int functionB();
A * objectA;
};
#endif //B_H
A.CPP
#include "A.h"
A::A(){}
int A::functionA() {
return 11;
}
b.cpp
#include "B.h"
B::B(){}
int B::functionB() {
return objectA->functionA();
}
现在我使用该行进行编译:g++ A.cpp B.cpp -Wall -Wextra -O2 -march=native -std=gnu++1z
我得到此错误:
B.cpp: In member function 'int B::functionB()':
B.cpp:4:19: error: invalid use of incomplete type 'class A'
return objectA->functionA();
^
In file included from B.cpp:1:0:
B.h:1:7: note: forward declaration of 'class A'
class A;
^
如何使用此处声明的函数的成员类?
查看编译B.cpp
时所包含的内容,您有一个A
类的正向声明,但不是真实的定义。因此,在第4行的B.cpp
中,functionA
是编译器未知的,因此您的类型不完整。
您应该在B.cpp
中包括A.h
。
在A.cpp
中,包括A.h
和 B.h
在B.cpp
中,包括B.h
和 A.h
。
它的作用是因为:
- 我们没有循环包含(一个包含另一个标头文件的标题文件,其中包括原始文件)
- 每个类实现"看到"另一类的外观,但不是如何实现,我们不会破坏"与实现"规则的界面分离。在某些情况下,我们不这样做,但是在大多数情况下,它是有效的。
拇指规则(只有拇指规则!)是在使用该类的每个.cpp
文件中包括类标头。因此,如果foo.cpp
使用类bar
,并且bar
类接口在bar.h
中,则foo.cpp
应包括bar.h
。我们没有遵循该规则的一些具体情况,但是在大多数情况下,它是有效的。
使用只有向前声明的类的成员是不可能的。
如果您的代码使用成员函数,则应完全声明该类,因为编译器需要检查具有此名称的成员函数是否实际上存在。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针