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

C++ 我应该把这些函数放在一个独立的.h文件中吗?,c++,function,class,scope,header,C++,Function,Class,Scope,Header,我有一个项目,其中包括2个文件:main.cc和header1.h。当main.cc实例化类名并调用其成员函数时,头文件包含类的定义 main.cc: #include <header1.h> int main(){ className classobject(); classobject.function1(); ... } } #include <head1.h> int main(){ className classobject;

我有一个项目,其中包括2个文件:main.cc和header1.h。当main.cc实例化类名并调用其成员函数时,头文件包含类的定义

main.cc:

#include <header1.h>
int main(){
    className classobject();
    classobject.function1();
    ...
    }
}
#include <head1.h>
int main(){
className classobject;
void classobject.function1();
...
}
这样,我遇到了一个错误:函数定义不应该放在“{”标记之前

因此,我决定将function2的定义放在类之外,并将其放在一个独立的.h文件中。这样,我的项目将包括3个文件,即:main.cc、head1.h和function2.h文件:

main.cc:

#include <header1.h>
int main(){
    className classobject();
    classobject.function1();
    ...
    }
}
#include <head1.h>
int main(){
className classobject;
void classobject.function1();
...
}
虽然function2也可以定义为类成员函数,以便在类内时可以将其移出function1,但我想知道上述处理是否合法。此外,头文件的创建是否有一些使用普通处理建立的隐式规则


有人能给点意见吗?提前谢谢。

在className.hpp中这样做

然后用你的className.cpp

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


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

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

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

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


†如果将标题包含在多个编译单元中,则每个编译单元都将包含函数的定义。“一个定义”规则不允许在多个编译单元中定义函数。标记为“内联”的函数将被区别对待。它们可以在多个编译单元中定义s只要它们各自有一个相同的定义。

可能的重复我更喜欢将函数2作为类名的私有成员。类定义后缺少分号。您应该使用.cpp文件定义类方法。这个问题更多的是关于如何处理函数2,然后将类拆分为标头和cpp file.Hi,@user207933,谢谢你的帮助。但是你说我只能在一次编译uinit中使用头文件是什么意思?你能详细解释一下吗?此外,我已经分别在类和类方法中声明了使用void function1和double function2内联的两个函数。@David I添加了解释为什么缺少内联会阻止在多个编译单元中使用头。不,在问题中显示的代码中,没有内联声明函数。
double function2(){
...
}
class className{
   public:
        className();
   private:
       void function1();
};
#include"className.hpp"

className::className(){ /*defintion*/ }

void className::function1(){ /*definition*/ }