如何使用前向声明类的成员函数?

时间:2017-10-04 15:38:13

标签: c++ class forward-declaration member-functions

我有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

如何使用此处声明的函数的成员类?

3 个答案:

答案 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

它的工作原因是:

  1. 我们没有循环包含(包含另一个头文件的头文件,其中包含原始文件)
  2. 每个班级实施"看到"如何对待其他课程,而不是如何实施,我们不会打破"界面与实施的分离"规则。在某些情况下,我们不会这样做,但在大多数情况下,它是有效的。
  3. 拇指规则(只有拇指规则!)是在每个使用该类的.cpp文件中包含类标题。因此,如果foo.cpp使用课程bar,而课程bar界面位于bar.h,则foo.cpp应包含bar.h。有一些特定情况我们不遵守该规则,但在大多数情况下,它是有效的。

答案 2 :(得分:0)

使用只有前向声明的类成员是不可能的。

如果您的代码使用成员函数,则应该完全声明该类,因为编译器需要检查具有此名称的成员函数是否确实存在。