0

わかりました。変数定義を移動することでエラーを修正しましたが、なぜ問題があるのか​​ わかりません。
簡略化された背景: オブジェクトがあり、そのオブジェクトのすべてのインスタンスをリストで追跡したいので、単純にクラスの List<> 静的メンバーを作成しました。以下は、私がそれで遊ぶことを可能にした簡単な表現です。静的ライブラリで「この行」としてマークされた行があるとします。実行時エラーが発生します。オブジェクトはヘッダー ファイルで定義され、両方の場所で同じヘッダー ファイルです。「この行」を最終的なアプリケーションのコードに移動すると、それが機能します....なぜですか? なぜ違うのかさっぱりわかりません。

#include "stdafx.h"
#include <list>

using namespace std;

class someobject
   {
   public:
      someobject()
         {
         // do some stuff.
         theStaticList.push_back(this);
         }

      void func()
         {
         printf("Made it!!\n");
         }
   static list<someobject*> theStaticList;
   };

list<someobject*> someobject::theStaticList;    //*** This line


someobject global;

int main()
{
   someobject initial;

   initial.func();
   global.func();

   list<someobject*>::iterator iter;

   printf("\n\nLoop the Static List\n");

   for (iter = someobject::theStaticList.begin(); iter != someobject::theStaticList.end  ();       iter++)
       (*iter)->func();

return 0;
}
4

1 に答える 1

0

その行をヘッダー ファイルに入れ、そのヘッダーを 2 つ以上のソース ファイルにインクルードすると、ヘッダーがインクルードされる各ソース ファイルでリスト オブジェクトを定義することになります。

これは 1 つの定義規則に違反しているため、これを行うと、リンカーは当然のことながらエラーを返します。

1 つの(そして 1 つのみの) ソース ファイルでオブジェクトを定義したいと考えています。ライブラリの場合、これはユーザーのソース ファイルではなく、ライブラリ内の何らかのオブジェクト ファイルである必要があります (少なくとも一般的なルールとして)。

于 2013-01-26T23:23:25.943 に答える