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

如果将该行放在头文件中,然后将头包含在两个或多个源文件中,则您将在包含头的每个源文件中定义列表对象。

这违反了一个定义规则,所以当你这样做时,链接器会很正确地给你一个错误。

您想在一个(并且只有一个)源文件中定义对象。对于一个库,它应该是库中的某个目标文件,而不是用户的源文件(至少作为一般规则)。

于 2013-01-26T23:23:25.943 回答