Получая LNK2005, я не вижу, что я могу сделать, чтобы это исправить - PullRequest
0 голосов
/ 01 марта 2012

Я опустил #include "stdafx.h в каждом файле.

stdafx.h (предварительно скомпилированные заголовки)

#include a.h
#include b.h
class stuff;
stuff * s

хиджры

class thing{float f; void fun()};

a.cc

void thing::fun(){}
thing::thing():
    f(b->f) {} // lnk 2005 linking error

b.h

struct stuff
{
    float f;
    thing * t;
};

b.cc

stuff::stuff(): f(3.4) { t = new thing; }

main.cc

int main()
{
    s = new stuff;
    s -> fun();
}

Как видите, я пытаюсь получить доступ к s, который предварительно объявлен в stdafx.h

Я делаю этот дизайн, поэтому мне не нужно полагаться на синглтоны (у меня есть один основной класс, к которому я хочу получить доступ в других меньших объектах)

Нужно ли как-нибудь использовать ключевое слово extern? Прекомпилированный заголовок вызывает проблему?

Ответы [ 3 ]

1 голос
/ 01 марта 2012

В stdafx.h вы объявили s, но никогда не определяли его.Я бы:

  1. Добавить extern к объявлению в stdafx.h
  2. Добавить определение s в main.cc следующим образом:

    вещи * s = NULL;

0 голосов
/ 15 марта 2012

решил это, переработав код.C ++ не очень чист в использовании.

0 голосов
/ 01 марта 2012

Я предлагаю удалить глобальные переменные.Они опасны, потому что любая задача может читать и писать в нее.В многопоточных и многозадачных системах управление доступом к глобальной переменной становится необходимым и более сложным.

В моем текущем проекте я потребовал, чтобы не было глобальных переменных.Могут быть статические локальные переменные с геттерами и сеттерами.Использование геттеров и сеттеров позволяет скользить по шаблонам, чтобы предотвратить возникновение проблем многозадачности.

Старайтесь изо всех сил избавиться от глобальной переменной.Вы уже нашли одну проблему против них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...