我是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进行并排比较,它们相似且非常长)。 我感觉这是一个很常见的场景,但是我没有找到一个很好的例子。 是不是有明显的错误? 谢谢!
你想做的事情是相当普遍的,如果你有较大的类。 您需要的是一个包含所有声明的头文件,例如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 */ }
总之,只有在特定的情况下(如模板或内联函数),定义才能在头中。 只要您只包含每个头一次,它就可以工作,但它仍然是错误的,所以将定义放在翻译单元/源文件中。