提问者:小点点

如何在不同的头文件中实现成员函数?


我是C++类的新手,这是我的问题

例如,我在文件b0.h中有一个类

class B::virtual public A {
  void func1() {
    some work1;
  }
  void func2() {
    some work2;
  }
  ...
};

现在我想将func2()的实现移到另一个头文件中,例如b1.h,所以我做了以下操作:

#include "path/to/b0.h"
void B::func2(){
  some work2;
}

但编译器会抱怨

use of undeclared identifier 'B'
void B::func2() {
     ^ 

(我还测试了以下内容:在b0.h中,我包含了b1.h,如果我将b1.h中的func2()设置为静态函数,那么我可以从b0.h中调用它。)

目标是将b的成员分成两个头文件,每个头文件包含一个函数实现(我想对不同文件中的func1和func2进行并排比较,它们相似且非常长)。 我感觉这是一个很常见的场景,但是我没有找到一个很好的例子。 是不是有明显的错误? 谢谢!


共1个答案

匿名用户

你想做的事情是相当普遍的,如果你有较大的类。 您需要的是一个包含所有声明的头文件,例如b.h:

class B : virtual public A { // : instead of :: 
  void func1(); // return type, no function body
  void func2(); // return type, no function body
};

然后,您可以将定义(实际实现)拆分到任意多个源文件上。 例如,文件b_func1.cpp可能包含b::func1的定义

#include "path/to/b.h"

void B::func1() { /* some code */ }

文件b_func2.cpp可能包含b::func2的定义

#include "path/to/b.h"

void B::func2() { /* some code */ }

总之,只有在特定的情况下(如模板或内联函数),定义才能在头中。 只要您只包含每个头一次,它就可以工作,但它仍然是错误的,所以将定义放在翻译单元/源文件中。