我应该把这些函数放在一个独立的.h文件中吗

Should I put these functions in a standalone .h file?

本文关键字:独立 一个 文件 函数 我应该      更新时间:2023-10-16

我有一个项目,它包括两个文件:main.ccheader1.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.cchead1.hfunction2.hfile:

main.cc:

#include <head1.h>
int main(){
className classobject;
void classobject.function1();
...
}

head1.h:

#include <function2.h>
class className{
double function2();
...
}

功能2.h:

double function2(){
...
}

虽然函数2也可以定义为类成员函数,这样它就可以在类内从函数1中移出,但我想知道上面提到的处理是否合法。此外,头文件的创建是否有一些由用法建立的隐含规则(常见处理)?

有人能评论一下吗?提前谢谢。

我看到的代码中的第一个问题是在头中定义了className::function1,但忘记声明它为inline。结果是,您只能在单个编译单元中使用标头。这是个糟糕的设计。我建议在源文件中定义它。

其次,您尝试在另一个函数中定义function2。这是不允许的,因此您出现了编译错误。你说你决定把它的定义移到类之外,但它的定义已经在类定义之外了。将定义移出className::function1的定义确实是一个正确的选择。

如果function2className::function1中的使用之外是可重用的,那么在单独的头中声明它确实是一个好主意,也是完全合法的。但就像className::function1一样,您也在标头中一次又一次地定义function2,而没有声明它为inline,因此如果您试图在多个编译单元中使用它,您将遇到麻烦。我也建议在源文件中定义function2

如果在多个编译单元中包含标头,那么这些编译单元中的每个都将包含函数的定义。一个定义规则不允许在多个编译单元中定义函数。对标记为inline的函数进行不同的处理。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义即可。

className.hpp 中执行类似操作

class className{
   public:
        className();
   private:
       void function1();
};

然后在您的className.cpp

#include"className.hpp"
className::className(){ /*defintion*/ }
void className::function1(){ /*definition*/ }

然后,您可以使用makefile来计算className.o文件并将其链接到主文件。

如果您想定义另一个函数(如function2()),则可以将其定义为className.cpp