все мои геттеры и сеттеры в основном должны проверять "тело инициализировано?"
Если вы используете Qt, я полагаю, вы используете C ++.
Я не знаю Qt и не знаю, почему вы хотите изменить существующий механизм, но в любом случае: одна вещь, которую вы можете сделать в C ++, которая может быть вам полезна, это перегрузить оператор ->
для получить доступ к вашим объектам. Когда кто-то вызывает оператор ->
, оператор может также создать объект точно в срок, если он еще не был создан, что-то вроде:
World& getWorld();
class Body;
class MyWrapper
{
Body* m_body;
public:
MyWrapper() : m_body(0) {}
Body* operator->()
{
if (!m_body)
{
m_body = new Body(getWorld());
}
return m_body;
}
... etc ...
};
Редактировать
Что вы имеете в виду, «изменить существующий механизм»? Тот, который выложил физическая библиотека? Я думаю, что упомянул свои причины.
Да.
С вашим решением ... что делает getWorld ()? Это глобальная функция? Если мир плавает в глобальном пространстве, то проблемы на самом деле нет, я могу просто создать экземпляр тела в то же время, когда создается экземпляр MyWrapper.
Да, он возвращает ссылку на Мир, который вам нужен для создания тела в библиотеке физики. Это пример, я не знаю, откуда вы взяли ссылку на ваш Мир, и когда.
Но что, если мир все еще не существует в тот момент, когда используется оператор ->? Я не совсем уверен, что это что-то решает. Не говоря уже о том, что так или иначе, вы все еще передаете мир телу
Может быть, getWorld
сгенерирует исключение, если оно вызывается слишком рано. В любом случае, то, что это должно было вас купить, было:
Возможность создания MyWrapper
экземпляров без ссылки на Мир и, возможно, до создания мира.
Возможность создания экземпляра Body точно в срок, когда клиент попытался получить доступ к любому из свойств или методов Body
Оператор -> - это то, что клиенты использовали бы, чтобы получить физическое тело, которое вы упаковываете: как «умный указатель».
Возможно, будет проще понять и / или предложить решения для вашей проблемы, если вы проиллюстрируете свою проблему с помощью некоторого псевдокода.
Не говоря уже о том, что так или иначе, вы все еще передаете мир телу
Вы сказали, что это требование базовой библиотеки. Когда вы сказали: «Должен ли я попытаться исправить», я подумал, что вы имеете в виду «Должен ли я реализовать другой API в моей оболочке и скрыть существующий API в моей частной реализации?» Мне не пришло в голову, что вы можете попытаться изменить (а не просто обернуть) существующую реализацию.