如果我将.cpp剪切并粘贴到我的.h的底部,一切都会一样吗?

Mat*_*tag 0 c++

我有一个非常简单的类,我想将它合并到一个.h文件中.如果我将.cpp的内容剪切并粘贴到我的.h的底部,一切都会一样吗?

特别是,int MyClass::myStaticVar = 0;在.cpp顶部的任何类定义之外都有静态成员变量初始化 ,然后是静态成员函数实现void MyClass::myStaticMethod() {...}.一些非静态成员函数已经在.h中实现,而不是.cpp.所以你可以看到这里有一些细微差别我想澄清一下.


编辑到目前为止,我得到的是:

这很顽皮,但是如果你只有#include.h一次它会起作用.它破坏了惯例,并没有像.h那样真正起作用,所以它也可能被命名为.doofus.

现在,例如,查看TUIO C++绑定.很多类都包含一个.h文件,没有cpp(TuioPoint.h,TuioCursor.h,TuioObject.h等).我不认为这太糟糕了......

Moo*_*uck 5

如果你cpp在整个项目中留下一个文件,那么它将起作用(但这是不好的做法).如果您有两个cpp文件都包含该标头,那么您将破坏一个定义规则,并且您(应该)会收到链接器错误.

可以,如果(A)的所有功能模板(事实上,你必须在这种情况下),或(B)的所有功能都被标记为做到这一点inline.

[编辑]你是不是已经具有的问题的原因是一个函数在类定义中所定义自动标记为内联.因此:没问题.但是,如果函数是在类定义之外定义的,则它应该在cpp文件中.此外,静态成员应始终位于cpp文件中.

[Edit2]非inline,非template函数和文件范围变量(全局变量和静态成员)应始终位于cpp文件中的原因是,当编译器找到该行代码时,它会在那里创建函数/变量.显然,必须创建一次才能使用它.为什么不在头文件中?因为如果标题包含在两个cpp文件中,它将在两个地方创建(我的hpp工作中的文件实际上包含在几千个cpp文件中).C++有一个"单一定义规则",每个函数/对象只能定义/创建一次,以防止出现这个明显的错误:

int MyClass::myStaticVar = 0;
int MyClass::myStaticVar = 7;
Run Code Online (Sandbox Code Playgroud)

它会用哪个?您刚刚创建了两个具有相同名称的变量!所以这是不允许的,即使它们完全相同,(内联/模板除外).每个cpp文件只编译一次(除非出于某些奇怪的原因,它include来自其他东西),这可以防止意外违反单一定义规则.
此外,hpp文件用于声明,cpp文件用于定义/实例化.