Я больше в JAVA, но когда HI-Perf находится в списке требований, C/C++ должен появиться на столе. И так оно и было. И, как и ожидалось, я наткнулся на то, что я не могу понять, и не могу разобраться в SO. Так может ли кто-нибудь объяснить мне, почему не опекун в заголовке ниже работает?cpp - почему защитник не защитил меня от нескольких определений?
// a0a.h
#ifndef _A0A
#define _A0A
class State {
public:
static State* A;
}
State* State::A = new State(); /* this is going to be troublesome */
#endif
.
B.h // #include "a0a.h"
C.h // #include "a0a.h"
XXX.h // #include "B.h"
XXX.h // #include "C.h"
и компиляция дает мне ошибку с несколькими определениями в указанной выше строке.
Я заработал, переместив эту строку в исходный файл .cpp, но я все же хочу понять, почему защитник не защитил меня от стрельбы по моей ноге здесь?
Надеюсь, мне не нужно говорить, что это всего лишь фиктивный код, отражающий то, что я сделал, а не тот код, который я писал.
EDIT
Repeated Multiple Definition Errors from including same header in multiple cpps не объясняет, почему. Я имею в виду, что я не получаю картину из любого из этих ответов - они просто дают предложения (ни один из которых мне не нужен).
Конечно, я могу погрузиться в книги и, возможно, узнаю, как все это заставляет компилятор чихать в моей консоли, но спрашивать, ТАК, намного быстрее и, скорее всего, поможет кому-то еще понять.
Статичность должна быть определена в файле реализации (* .cpp). – ZDF
*** Почему защитник не защитил меня от нескольких определений? *** Поскольку защитник include предотвращает множественное включение в одну и ту же единицу перевода (исходный файл cpp). – drescherjm
У вас есть только один .cpp-файл, в который вы включаете свои приложения? – marcinj