我应该将这些功能放在一个独立的.h文件中吗?

时间:2015-11-30 12:56:18

标签: c++ function class scope header

我有一个包含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。此外,头文件的创建是否有一些通过使用建立的隐式规则(常见处理)?

有人可以发表评论吗?提前谢谢。

2 个答案:

答案 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的函数的处理方式不同。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义。