我有一个包含2个文件的项目: main.cc 和 header1.h 。当 main.cc 实例化一个类“className”并调用它的成员函数时,头文件包含该类的定义。
main.cc:
#include <header1.h>
int main(){
className classobject();
classobject.function1();
...
}
}
那么header1.h:
class className{
public:
className();
void function1();
...
};
double className::function1(){
double function2(){
...
}
}
有了这个,我遇到了一个错误,上面写着:“函数定义不应放在'{'标记之前。
所以我决定将 function2 的定义放在类之外,并将其放在一个独立的 .h 文件中。这样,我的项目将包含3个文件,即: main.cc , head1.h 和 function2.h 文件:
main.cc:
#include <head1.h>
int main(){
className classobject;
void classobject.function1();
...
}
head1.h:
#include <function2.h>
class className{
double function2();
...
}
function2.h:
double function2(){
...
}
虽然也可以将function2定义为类成员函数,以便在类内部移出function1时,我想知道上面提到的处理是否是leagal。此外,头文件的创建是否有一些通过使用建立的隐式规则(常见处理)?
有人可以发表评论吗?提前谢谢。
答案 0 :(得分:0)
在className.hpp
class className{
public:
className();
private:
void function1();
};
然后在className.cpp
#include"className.hpp"
className::className(){ /*defintion*/ }
void className::function1(){ /*definition*/ }
然后你可以在oder中使用makefile来计算className.o
文件并将其链接到主文件。
如果您想定义另一个功能(如function2()
),则可以将其定义为className.cpp
答案 1 :(得分:0)
我看到代码中的第一个问题是您在标头中定义className::function1
,但忘记将其声明为inline
。结果是您只能在单个编译单元†中使用标头。这是一个糟糕的设计。我建议改为在源文件中定义它。
其次,您尝试在另一个函数中定义function2
。这是不允许的,因此您遇到了编译错误。你说你决定将它的定义移到类外,但是它的定义已经超出了类的定义。将定义移到className::function1
定义之外确实是一个正确的选择。
如果function2
可以在className::function1
之外使用,那么它确实是一个好主意,并且在单独的标题中声明它是完全合法的。但就像className::function1
一样,您也会在标题中一次又一次地定义function2
,而不会声明它inline
,因此如果您尝试在多个编译单元中使用它,您将遇到麻烦。我建议在源文件中定义function2
。
†如果在多个编译单元中包含标头,则每个编译单元都将包含该函数的定义。 一个定义规则不允许在多个编译单元中定义函数。标记为inline
的函数的处理方式不同。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义。