как объявить структуру в файле глобальных констант с внутренним связыванием?
.h file
static struct offsets {
std::array<DWORD, offsetSize> minerals = { 0x168, 0x1B8, 0x30, 0x10 };
std::array<DWORD, offsetSize> foods = { 0x168, 0x1B8, 0x30, 0x18 };
std::array<DWORD, offsetSize> influence = { 0x168, 0x1B8, 0x30, 0x38 };
std::array<DWORD, offsetSize> unity = { 0x168, 0x1B8, 0x30, 0x40 };
std::array<DWORD, offsetSize> alloys = { 0x168, 0x1B8, 0x30, 0x4C };
std::array<DWORD, offsetSize> consumer_goods = { 0x168, 0x1B8, 0x30, 0x54 };
}
далее в этом же файле я объявляю:
const offsets offsetList
и хочу использовать исключительно offsetlist для доступа к значениям структуры, а саму структуру нужно скрыть, чтоб она не была доступна в других файлах, т.е чтоб пользователи не могли объявить свою структуру, а обращались исключительно к глобальной константе offsetList. Не смотря на то что я объявил структуру как static, она доступна в других файлах при подключении заголовка.
У меня есть вариант решения, но он не работает как нужно:
А именно, поместить объявление структуры в constants.cpp вместо constants.h, но объявить я могу ее исключительно в constants.cpp тем самым теперь не видно стуктуру, а так же const offsets offsetList. А если объявить структуру в constants.h файле, а затем определить ее в constants.cpp то всё равно эта структура будет видна во всех файлах где подключен constants.h
Еще пробовал решить это с помощью анонимного namespace, но мой компилятор всё равно видит этот объект:

Как объявить структуру с внутренним связыванием, а затем определить ее глобально в constants.h чтобы пользователи не смогли определять свои объекты этой структуры?
Ответы (1 шт):
Краткий намек на синглтон:
struct offsets
{
int a = 1, b = 2, c = 3; // не стал таскать ваше многословное определение
friend offsets& offsetList();
private:
offsets() = default;
offsets(const offsets&) = delete;
};
offsets& offsetList() // Вынес из определения класса для краткости обращения
{ // чтоб не таскать имя offsets::offsetList()
static offsets o;
return o;
}
int main()
{
cout << offsetList().a << offsetList().b;
// offsets s; <- это работать не будет
// offsets t(offsetList()); <- это работать не будет
}