как объявить структуру в файле глобальных констант с внутренним связыванием?

.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 шт):

Автор решения: Harry

Краткий намек на синглтон:

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());     <- это работать не будет
}
→ Ссылка