Ось що я маю:
//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;
}
і це дає мені
main.o: multiple definition of graphics::camera
graphics.o: first defined here
Я теж намагався робити
camera_c &&camera = camera_c(ctor stuff);
І це дає мені таку саму помилку, але від main.cpp
і graphics.cpp
Так що моє запитання
Чи існує якийсь можливий спосіб мати посилання на клас у цьому просторі імен? Або я повинен просто використовувати покажчик? В ідеалі це має бути посиланням, але це може бути неможливо.
Відповіді:
5 за відповідь № 1Ви неправильно зрозуміли помилку.
Помилка вказує на те, що main.cpp та graphics.cpp включають в себе графіку .hpp, яка порушує Одне визначення правила.
Зробіть цю змінну extern
так само:
namespace graphics {
extern camera_c &camera;
};
І визначте це в лише один вихідний файл.
namespace graphics {
camera_c &camera = default_camera;
};
2 для відповіді № 2
А як на рахунок...
// graphics.hpp
namespace graphics {
extern camera_c camera;
}
// graphics.cpp
#include <graphics.hpp>
namespace graphics {
camera_c camera(...);
}
Я повинен додати, що глобально визначені змінні - це поганий стиль; якщо ви не маєте справжніх застарілих API, вони викликають більше проблем, ніж це варто!