假设我有一个包含jWorld
类的框架,其中包含有关我的物理环境(重力等)的有用信息,我有jPhysicsObject
将使用此信息。每当我想对jPhysicsObject
进行相关更改时,jWorld
是否有办法在不传递jWorld
的情况下访问jPhysicsObject
信息?
答案 0 :(得分:1)
是的,传递它一次作为参考(如果jWorld shoudn`t更改为对象)或作为指向jPhysicsObject的构造函数的指针(出于安全原因,您可以使用shared_ptr作为指针)
答案 1 :(得分:1)
尝试通过引用传递(最好使用const引用)。
另一个想法是实现一个全局实例,例如Singleton。
否则使用静态方法和静态数据成员。
答案 2 :(得分:1)
让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);
}
答案 3 :(得分:0)
另一个选择是使用Observable设计模式。你的jPhysicsObject将是一个观察者,而你的jWorld将是可以生成的。 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;
};