我有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();
}
现在我使用以下行编译:{{1}}
我收到此错误:
g++ A.cpp B.cpp -Wall -Wextra -O2 -march=native -std=gnu++1z
如何使用此处声明的函数的成员类?
答案 0 :(得分:3)
查看编译B.cpp
时包含的内容,您有类A
的前向声明,但不是真正的定义。因此,在第4行的B.cpp
中,编译器不知道functionA
,因此您的类型不完整。
您应该在A.h
中加入B.cpp
。
答案 1 :(得分:2)
在A.cpp
中,同时包含A.h
和 B.h
在B.cpp
中,同时包含B.h
和 A.h
。
它的工作原因是:
拇指规则(只有拇指规则!)是在每个使用该类的.cpp
文件中包含类标题。因此,如果foo.cpp
使用课程bar
,而课程bar
界面位于bar.h
,则foo.cpp
应包含bar.h
。有一些特定情况我们不遵守该规则,但在大多数情况下,它是有效的。
答案 2 :(得分:0)
使用只有前向声明的类成员是不可能的。
如果您的代码使用成员函数,则应该完全声明该类,因为编译器需要检查具有此名称的成员函数是否确实存在。