Скажем, у меня есть среда, содержащая класс jWorld
который содержит полезную информацию о моей физике (гравитация и т.д.), И у меня есть jPhysicsObject
который будет использовать эту информацию. Есть ли способ для jPhysicsObject
получить доступ jWorld
информации jWorld
без передачи jWorld
каждый раз, когда я хочу внести соответствующие изменения в jPhysicsObject
?
Попробуйте перейти по ссылке (предпочтительна ссылка на константу).
Другая идея - реализовать глобальный экземпляр, такой как Singleton.
В противном случае используйте статические методы и статические элементы данных.
Просто есть конструктор jPhysicsObject
взять jWorld
объект в качестве ссылки. И затем запросите его, когда вам нужно его запросить.
class jWorld {
public:
jWorld();
};
class jPhysicsObject {
public:
jPhysicsObject(jWorld const & world): mWorld(world);
private:
jWorld const & mWorld;
};
int main() {
jWorld world;
jPhysicsObject object(world);
}
Да, передайте его один раз в качестве ссылки (если jWorld shoudn't не изменится для объекта) или как указатель на конструктор jPhysicsObject (по соображениям безопасности вы можете использовать shared_ptr для указателя)
Другим вариантом является использование шаблона проектирования Observable. Ваш jPhysicsObject будет наблюдателем, в то время как ваш jWorld будет ovservable. jPhysicsObject добавит себя в качестве наблюдателя в jWorld. Когда что-то изменится в jWorld, jPhysicsObject будет извещен об этом. Таким образом, у вас будет слабосвязанная архитектура, которая пригодится, если вы планируете вводить другие объекты, которые будут слушать изменения в классе jWorld.
Вот фрагмент кода, который поможет вам начать работу с шаблоном Observer:
//IObserver.hpp
#pragma once
#include <memory>
template <class T>
class IObserver
{
public:
virtual ~IObserver() {};
virtual void Notify(T data) = 0;
protected:
};
//Observable.hpp
#pragma once
#include "IObserver.hpp"
#include <list>
#include <string>
#include <memory>
template<class T>
class Observable
{
public:
void NotifyObservers(T data)
{
for (auto o : m_observers)
{
o.Notify(data);
}
}
void AddObserver(std::shared_ptr<IObserver<T>> &obs)
{
m_observers.push_back(obs);
}
void RemoveObserver(std::shared_ptr<IObserver<T>> &obs)
{
m_observers.remove(obs);
}
private:
std::list<std::shared_ptr<IObserver<T>>> m_observers;
};
#pragma once
обратили мое внимание на #pragma once
- я раньше такого не видел.