Доступ к информации о классе из другого класса без его передачи

0

Скажем, у меня есть среда, содержащая класс jWorld который содержит полезную информацию о моей физике (гравитация и т.д.), И у меня есть jPhysicsObject который будет использовать эту информацию. Есть ли способ для jPhysicsObject получить доступ jWorld информации jWorld без передачи jWorld каждый раз, когда я хочу внести соответствующие изменения в jPhysicsObject?

  • 1
    Статические члены и методы. Прозвище "мир" почти подразумевает это.
Теги:
class

4 ответа

1
Лучший ответ

Попробуйте перейти по ссылке (предпочтительна ссылка на константу).

Другая идея - реализовать глобальный экземпляр, такой как Singleton.

В противном случае используйте статические методы и статические элементы данных.

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

Да, передайте его один раз в качестве ссылки (если jWorld shoudn't не изменится для объекта) или как указатель на конструктор jPhysicsObject (по соображениям безопасности вы можете использовать shared_ptr для указателя)

0

Другим вариантом является использование шаблона проектирования 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;
};
  • 0
    Я боюсь, что в данный момент это слишком углубляется в язык для меня, но спасибо, что #pragma once обратили мое внимание на #pragma once - я раньше такого не видел.
  • 0
    @theStandard #pragma однажды гарантирует, что один и тот же заголовочный файл включается только один раз в исходный файл. Это вещь Microsoft. Если вы предпочитаете не использовать его, вы можете разместить содержимое заголовочного файла в блоке "#ifndef H_FILE #define H_FILE #endif"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню