【问题标题】:Should I put these functions in a standalone .h file?我应该把这些函数放在一个独立的 .h 文件中吗?
【发布时间】:2015-11-30 12:56:17
【问题描述】:

我有一个项目,其中包括 2 个文件: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.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,但我想知道上面的处理是否合法。另外,头文件的创建是否有一些由用法建立的隐含规则(常见处理)?

谁能给一些cmets?提前致谢。

【问题讨论】:

标签: c++ function class scope header


【解决方案1】:

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

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

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

如果您在多个编译单元中包含头文件,那么每个编译单元都将包含函数的定义。 一个定义规则不允许在多个编译单元中定义一个函数。标记为inline 的函数会被区别对待。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义。

【讨论】:

  • 嗨,@user2079303,感谢您的帮助。但是你说我只能在单个编译 uinit 中使用头文件是什么意思?能否详细解释一下?
  • 此外,我已经在类和类方法中分别使用 void function1double function2 声明了 2 个内联函数。
  • @David 我解释了为什么缺少inline 会阻止在多个编译单元中使用标头。不,在您在问题中显示的代码中,您没有声明函数inline
【解决方案2】:

在您的 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

【讨论】:

  • 这个问题更多的是关于如何处理 function2 然后将类拆分为头文件和 cpp 文件。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2023-03-18
相关资源
最近更新 更多