我应该将这些函数放在一个独立的 .h 文件中吗?
Should I put these functions in a standalone .h file?
我有一个包含 2 个文件的项目:main.cc 和 header1.h。当 main.cc 实例化一个 class "className" 并调用它的成员函数时,头文件包含 class.
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的定义放在class外面,单独放在.h[=43=里面] 文件。这样,我的项目将包含 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也可以定义为class的成员函数,这样在class里面就可以移出function1了,我想知道上面的处理是否合法。另外,头文件的创建是否有一些隐含的规则,由使用(共同处理)建立?
谁能给点意见?提前致谢。
在你的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
文件并 link 它到主文件。
如果你想定义另一个函数(比如function2()
),你可以定义它className.cpp
我在您的代码中看到的第一个问题是您在 header 中定义了 className::function1
,但忘记声明它 inline
。结果是您只能在单个编译单元 † 中使用 header。这是一个糟糕的设计。我建议改为在源文件中定义它。
其次,您尝试在另一个函数中定义 function2
。这是不允许的,因此您遇到了编译错误。您说您决定将它的定义移到 class 之外,但它的定义已经在 class 定义之外。将定义移到 className::function1
的定义之外确实是一个正确的选择。
如果 function2
在 className::function1
中的使用之外是可重复使用的,那么在单独的 header 中声明它确实是一个好主意并且完全合法。但是就像 className::function1
一样,您也在 header 中一次又一次地定义 function2
而没有声明它 inline
,因此如果您尝试使用它就会遇到麻烦在多个编译单元中。我建议也在源文件中定义 function2
。
† 如果在多个编译单元中包含 header,那么每个编译单元都将包含函数的定义。 一个定义规则 不允许在多个编译单元中定义一个函数。标记为 inline
的函数被区别对待。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义即可。
我有一个包含 2 个文件的项目:main.cc 和 header1.h。当 main.cc 实例化一个 class "className" 并调用它的成员函数时,头文件包含 class.
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的定义放在class外面,单独放在.h[=43=里面] 文件。这样,我的项目将包含 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也可以定义为class的成员函数,这样在class里面就可以移出function1了,我想知道上面的处理是否合法。另外,头文件的创建是否有一些隐含的规则,由使用(共同处理)建立?
谁能给点意见?提前致谢。
在你的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
文件并 link 它到主文件。
如果你想定义另一个函数(比如function2()
),你可以定义它className.cpp
我在您的代码中看到的第一个问题是您在 header 中定义了 className::function1
,但忘记声明它 inline
。结果是您只能在单个编译单元 † 中使用 header。这是一个糟糕的设计。我建议改为在源文件中定义它。
其次,您尝试在另一个函数中定义 function2
。这是不允许的,因此您遇到了编译错误。您说您决定将它的定义移到 class 之外,但它的定义已经在 class 定义之外。将定义移到 className::function1
的定义之外确实是一个正确的选择。
如果 function2
在 className::function1
中的使用之外是可重复使用的,那么在单独的 header 中声明它确实是一个好主意并且完全合法。但是就像 className::function1
一样,您也在 header 中一次又一次地定义 function2
而没有声明它 inline
,因此如果您尝试使用它就会遇到麻烦在多个编译单元中。我建议也在源文件中定义 function2
。
† 如果在多个编译单元中包含 header,那么每个编译单元都将包含函数的定义。 一个定义规则 不允许在多个编译单元中定义一个函数。标记为 inline
的函数被区别对待。它们可以在多个编译单元中定义,只要它们在每个编译单元中具有相同的定义即可。