2016-04-18 3 views
0

Здесь находятся файлы, отвечающие за эту ошибку компоновщика (только с указанием файла, пространства имен и имена классов):Пытаясь понять C++: повторяющиеся символы для архитектуры x86_64

// PubSub.hpp: 
#ifndef PubSub_hpp 
#define PubSub_hpp 
namespace PubSub { 
class Publisher {} 
} 
} 
#endif 

// Client.hpp: 
#ifndef Client_hpp 
#define Client_hpp 
#include "PubSub.hpp" 
class Client { 
} 
#endif 

// Scene.hpp: 
#ifndef Scene_hpp 
#define Scene_hpp 
#include "Client.hpp" 
class Scene { 
} 
#endif 

код компилируется без ошибок в этом состоянии. Но как только я ввести переменную в PubSub.hpp под пространством имен PubSub, как показано ниже:

// PubSub.hpp: 
#ifndef PubSub_hpp 
#define PubSub_hpp 
namespace PubSub { 
class Publisher {} 
} 
Publisher NetworkEventPublisher("someName"); 
} 
#endif 

Я получаю ошибку компоновщика в названии. Я могу найти обходной путь, но я пытаюсь изучить C++, поэтому я спрашиваю, что является причиной этого?

+3

Не определять объекты в заголовках. –

+0

Короче, чем ожидалось :-) Спасибо. –

+1

Связанный: [Статические переменные в C++] (http://stackoverflow.com/questions/3698043/static-variables-in-c/3698179#3698179). В то время как о статических переменных, в частности, ответ также охватывает ваш случай: непонимание того, что делает файл заголовка. – DevSolar

ответ

2

Но как только я ввести переменную в PubSub.hpp

Если включить PubSub.hpp в более чем одной единицы перевода (.cpp файл), то ваш NetworkEventPublisher будет определяться более один раз, и это то, что связующее звено в жалобах.

Раствор для перемещения:

Publisher NetworkEventPublisher("someName"); 

в файле реализации (т.е. PubSub.cpp.). Если вы хотите другой единицы перевода увидеть его, а затем добавить к PubSub.hpp экстерном декларации: extern Publisher NetworkEventPublisher;

2

Эта ошибка происходит потому, что в том числе и этот заголовочный файл в более чем одной единицы перевода (.cpp/файла .cc) создает объект в ЕП с тем же именем (он же символ).

Если вам нужен один экземпляр класса объявить его в заголовке, как extern и определить в файле .cc.

Если вам нужна копия в каждой единицы перевода, объявите и определите объект в заголовке как const, такие объекты неявно static.

+0

Предполагая, что он хочет изменить объект позже, можно объявить как статические? –

+0

@bkVnet можно. –

Смежные вопросы