/ / czy możliwe jest posiadanie odniesienia w przestrzeni nazw? - c ++, referencje, przestrzenie nazw

czy możliwe jest posiadanie odniesienia w przestrzeni nazw? - c ++, referencje, przestrzenie nazw

Oto co mam:

//graphics.hpp
#include guard

extern camera_c default_camera;

namespace graphics {
camera_c &camera = default_camera;
};

#endif


//graphics.cpp

camera_c default_camera(ctor stuff);

//main.cpp

#include <graphics.hpp>

int main() {
do stuff with graphics::camera;
}

i to daje mi

main.o: multiple definition of graphics::camera
graphics.o: first defined here

Próbowałem też

camera_c &&camera = camera_c(ctor stuff);

I to daje mi ten sam błąd, ale od main.cpp i graphics.cpp

Moje pytanie brzmi

Czy istnieje jakiś możliwy sposób na odniesienie do klasy w tym obszarze nazw? A może powinienem użyć wskaźnika? Idealnie powinno być odniesienie, ale to może nie być możliwe.

Odpowiedzi:

5 dla odpowiedzi № 1

Nie możesz zrozumieć błędu.

Błąd polega na informowaniu, że main.cpp i graphics.cpp zawierały grafikę.hpp, która narusza Jedna zasada definicji.

Ustaw tę zmienną extern także:

namespace graphics {
extern camera_c &camera;
};

I zdefiniuj to tylko jeden plik źródłowy.

namespace graphics {
camera_c &camera = default_camera;
};

2 dla odpowiedzi nr 2

Co powiesz na...

// graphics.hpp
namespace graphics {
extern camera_c camera;
}

// graphics.cpp
#include <graphics.hpp>

namespace graphics {
camera_c camera(...);
}

Muszę dodać, że globalnie zdefiniowane zmienne to zły styl; chyba że masz do czynienia ze starszymi interfejsami API, powodują one więcej problemów, niż są one warte!