Переменная списка в библиотеке Причины ошибки во время выполнения, почему?

ОК, ребята. Я исправил ошибку, переместив определение переменной, но не понимаю, почему возникает проблема.
Упрощенный фон: у меня есть объект, и я хочу отслеживать все экземпляры этого объекта в списке, поэтому я просто создал список<> статический член класса. Ниже было простое представление, которое позволило мне поиграть с ним. Если у меня есть строка, помеченная как «эта линия» в статической библиотеке. Я получаю ошибку во время выполнения. Объект определен в заголовочном файле и является одинаковым заголовочным файлом в обоих местах. Если я перенесу «эту строку» в код в моем окончательном приложении, и это сработает …. Почему? Я просто не понимаю, почему это отличается.

#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 linesomeobject 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;
}

0

Решение

Если вы поместите эту строку в файл заголовка, а затем включите заголовок в два или более исходных файла, вы определяете объект списка в каждом исходном файле, куда включается заголовок.

Это нарушает правило одного определения, поэтому компоновщик совершенно правильно выдаст вам ошибку, когда вы это сделаете.

Вы хотите определить объект в один (и только один) исходный файл. Для библиотеки это должен быть некоторый объектный файл в библиотеке, а не исходный файл пользователя (по крайней мере, как общее правило).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]