基本ODR违规:.h文件中的成员函数
免责声明:这可能是一个基本问题,但我是一名理论物理学家,通过训练试图学习正确编码,所以请耐心等待。
假设我想模拟一个相当复杂的物理系统。在我的理解中,对这个系统建模的一种方法是将它作为一个类来介绍。但是,由于涉及系统,类会很大,可能有很多数据成员、成员函数和子类。将主程序和这个类放在一个文件中会非常混乱,所以为了更好地概述项目,我倾向于将这个类放在一个单独的 .h 文件中。这样我就会有类似的东西:
//main.cpp
#include "tmp.h"
int main()
{
myclass aclass;
aclass.myfunction();
return 0;
}
和
// tmp.h
class myclass
{
// data members
double foo;
double bar;
public:
// function members
double myfunction();
};
double myclass::myfunction()
{
return foo + bar;
}
然而,这相当于我的新编译器中的以下编译器警告:function definitions in header files can lead to ODR violations. 那么我的问题是:处理这种情况的首选方式是什么?我想我可以将 tmp.h 变成 tmp.cpp,但据我所知,这是 .h 文件的预期用途?
回答
通常,类定义在“.h”文件中,其成员函数的定义在“.cpp”文件中。
如果你想在头文件中定义成员函数,你需要声明它们inline,或者将它们写在类定义中(这使得它们隐式内联)。