使用引用变量或将它们作为函数参数发送

时间:2016-04-28 10:55:40

标签: c++ function reference sfml encapsulation

我有下一堂课:

class State {
public:
    State(StateMachine& machine, sf::RenderWindow& window)
        : mMachine   { machine }
        , mWindow    { window } { }

    void draw();
protected:
    StateMachine&     mMachine;
    sf::RenderWindow& mWindow;

    std::vector<std::unique_ptr<Scene>> m_scenes;   
};

在绘图函数中,我迭代向量m_scenes并调用函数drawScene(),但是Scene类需要sf::RenderWindow才能绘制。

我应该在创建新场景时发送mWindow吗?

class Scene {
public:
    Scene(sf::RenderWindow& window)
        : mWindow    { window } { }

    void drawScene() {
        mWindow.draw(...);
    }
protected:
    sf::RenderWindow& mWindow;
};

或者最好将mWindow作为参数发送?

class Scene {
public:
    Scene() {}

    void drawScene(sf::RenderWindow& window) {
        window.draw(...);
    }
};

或者我应该在班级State中创建一个getter并发送State类的参考?

class State {
public:
    State(...);

    sf::RenderWindow& getWindow() { return mWindow; }
};

class Scene {
public:
    Scene(State& state)
        : mState { state } {}

    void drawScene() {
        mState.getWindow().draw(...);
    }
protected:
    State& mState;
};

如果我使用的是getter,它会减慢代码吗?

1 个答案:

答案 0 :(得分:0)

这取决于你的意图。如果要在创建场景时知道的单个窗口上绘制,可以使用传递给构造函数变体。如果要在多个/不同窗口上绘制场景,或者在场景创建时尚未知道窗口,请将窗口引用传递给drawScene。吸气剂似乎有点矫枉过正,但它不会减慢你的代码。

考虑到你提供的代码,我会在绘图时传递窗口参考,在每个场景中放置对窗口的引用似乎毫无用处。