2014-07-22 45 views
0

说我有一个框架,其中包含一个jWorld类,其中包含有关我的物理环境(重力等)的有用信息,我有一个jPhysicsObject将使用此信息。每当我想对jPhysicsObject进行相关更改时,jPhysicsObject是否有任何方法可以访问jWorld信息而不通过jWorld从另一个类访问类信息而不通过它

+1

静态成员和方法。绰号“世界”几乎意味着这一点。 – WhozCraig

回答

1

尝试按引用传递(最好是const引用)。

另一个想法是实现一个全局实例,例如Singleton。

否则使用静态方法和静态数据成员。

1

是的,它传递一个时间作为基准(如果jWorld shoudn`t一个对象更改),或者作为一个指针jPhysicsObject的构造(出于安全原因,你可以使用的shared_ptr的指针)

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; 
}; 
+0

恐怕现在对我来说有点过分了,但是感谢你给我注意了'#pragma once' - 我以前没有看到它。 – theStandard

+0

@theStandard #pragma曾经确保只有一次在源文件中包含相同的头文件。这是微软的事。如果你不想使用它,你可以在“#ifndef H_FILE #define H_FILE #endif”块中获得头文件内容 – armanali

+1

我知道它的作用。不幸的是,我被困在Linux上一段时间,所以这不是一个真正的问题,但我不介意普通的包括警卫。 – theStandard

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); 
}