从另一个类访问类信息而不传递它

时间:2014-07-22 18:13:30

标签: c++ class

假设我有一个包含jWorld类的框架,其中包含有关我的物理环境(重力等)的有用信息,我有jPhysicsObject将使用此信息。每当我想对jPhysicsObject进行相关更改时,jWorld是否有办法在不传递jWorld的情况下访问jPhysicsObject信息?

4 个答案:

答案 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;
};