Как вызвать функцию включения заголовка? - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над простой структурой для создания 2D игр. Он использует компоненты и системы, которые будут варьироваться от игры к игре.

Чтобы другие компоненты движка могли легко зацикливаться на всех возможных системах и / или компонентах, я бы хотел, чтобы они знали, как только одна из них будет включена (каждая имеет свой собственный заголовочный файл), таким образом, создав список всех возможных типов компонентов и типов систем.

В настоящее время я решил эту проблему с помощью структуры Register, которая помещается внизу после определения системы или компонента, передавая этот компонент / системный указатель в качестве аргумента конструктору структуры Register, т.е.

std::vector<Component*> Components    
struct Register{
    Register(Component* newComponent){
        Components.push_back(newComponent);
    }
}

Который затем используется в нижней части заголовка каждого компонента:

 Register 2DPosReg(&2DPos);

Это гарантирует, что прежде чем мы перейдем к нашему основному коду, все компоненты перечислены в Компонентах. Таким же образом я также добавляю имена этих компонентов и некоторые другие детали к некоторым глобальным векторам. Тем не менее, создание ненужного временного объекта, который никогда не используется просто для выполнения кода в его конструкторе, кажется излишне грязным.

Есть ли другой способ, при котором заголовок будет «известен» остальной части кода?

Я бы хотел избежать моего предыдущего решения, где у меня была длинная функция Register (& 2DPos, & Vel, & Acc, ... и т. Д.), Которая регистрировала бы все опции, поскольку любые изменения в используемых компонентах потребовали бы повторного редактирования этого функция.

(Кроме того, первый вопрос о переполнении стека, извинения, если он длинный / есть ошибки новичков)

1 Ответ

0 голосов
/ 08 ноября 2018

Однако создание временного объекта, который никогда не используется просто для выполнения кода в его конструкторе, кажется излишне грязным.

Вы правы в своей оценке эстетических качеств решения. К сожалению, в C ++ нет лучшего механизма для достижения того, что вам нужно.

В конце концов, даже стандартная библиотека C ++ должна использовать эту технику , когда она хочет кодировать инструмент для выполнения после включения заголовка.

Хотя, поскольку вы отметили этот C ++ 17 и намеревались поместить объявление объекта в заголовок, вам нужно сделать его встроенной переменной:

inline Register whatevs(...);

Он должен создавать один объект для файла заголовка.

...