インライン化の方法について質問があります。衝突モデル用に開発されたライブラリを使用しています。グラフィックインターフェイスを担当する1つのヘッダーファイルには、関数の宣言と実装が含まれていますが、関数はインライン化されていません。したがって、これらの機能を複数の変換単位に含めることはできません。実例として、ここに私が実例のために設計したダミーコードがあります:
LivingBeing.h
#ifndef LIVINGBEING_H
#define LIVINGBEING_H
class LivingBeing
{
public:
LivingBeing(double _size);
void breathe();
private:
double size;
};
//////////////
LivingBeing::LivingBeing(double _size)
{
size = _size;
}
void LivingBeing::breathe()
{
// do something
}
#endif
Forest.h
#ifndef FOREST_H
#define FOREST_H
#include "LivingBeing.h"
class Forest
{
public:
Forest(int _numberLivingBeings);
private:
int numberLivingBeings;
};
#endif
Forest.cpp
#include "Forest.h"
Forest::Forest(int _numberLivingBeings)
{
numberLivingBeings = _numberLivingBeings;
// Call LivingBeing constructor, methods etc...
}
Main.cpp
#include "Forest.h"
int main()
{
Forest forest = Forest(10);
return 0;
}
このコードは、コンストラクターLivingBeingとメソッドbreathの前にinlineキーワードを追加しない限り、コンパイルされません。エラーメッセージは次のとおりです。
1>main_test.obj : error LNK2005: "public: __thiscall LivingBeing::LivingBeing(double)" (??0LivingBeing@@QAE@N@Z) already defined in Forest.obj
1>main_test.obj : error LNK2005: "public: void __thiscall LivingBeing::breathe(void)" (?breathe@LivingBeing@@QAEXXZ) already defined in Forest.obj
1>C:\Users\******\Documents\Visual Studio 2010\Projects\TutorialChronoEngine\Debug\Test_3.exe : fatal error LNK1169: one or more multiply defined symbols found
私の質問は:インライン化メソッドの欠点は何ですか?私が使用している実際のライブラリはかなり大きいので、特定のファイル(私の例ではLivingBeing.h)からメソッドをインライン化して、それらのメソッドを複数の.cppファイルで使用できるようにします。ソースファイル自体を変更することで何が危険にさらされますか?
どうもありがとう