列出库中的变量导致运行时错误,原因

List Variable in Library Causes run time error, why?

本文关键字:运行时错误 原因 变量      更新时间:2023-10-16

好的伙计们。 我已经通过移动变量定义修复了错误,但我不明白为什么会有问题。
简化背景:我有一个对象,我想在列表中跟踪该对象的所有实例,所以我只是创建了一个 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("nnLoop the Static Listn");
   for (iter = someobject::theStaticList.begin(); iter != someobject::theStaticList.end  ();       iter++)
       (*iter)->func();
return 0;
}

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

这违反了一个定义规则,因此链接器会在您执行此操作时非常正确地为您提供错误。

您希望在一个(且仅一个)源文件中定义对象。对于库,这应该是库中的某个对象文件,而不是用户的源文件(至少作为一般规则)。