【问题标题】:c++ nested classes accessc++ 嵌套类访问
【发布时间】:2017-01-05 17:46:42
【问题描述】:

以下是一个简化的头文件,详细说明了三个类。我希望能够将“游戏”类中的指针保持私有,并允许 Introduction 对其进行修改。但是,按原样,这是行不通的。由于 Introduction 是 GameState 的衍生物,我想我可以修改这个指针吗?例子表明这是可能的。我真的不想把它移到游戏中的公共空间。

class Introduction;
class Game;
class GameState;

class GameState
{
    public:

    static Introduction intro;

    virtual ~GameState();
    virtual void handleinput(Game& game, int arbitary);
    virtual void update(Game& game);

};


class Introduction : public GameState
{
public:

    Introduction();

    virtual void handleinput(Game& game, int arbitary); 

    virtual void update(Game& game);

};


class Game
{
public:

    Game();

    ~Game();

    virtual void handleinput(int arbitary);

    virtual void update();

private:

    GameState* state_;

};

我关注的例子在这里...http://gameprogrammingpatterns.com/state.html

编辑:我想做这样的事情......

void Introduction::handleinput(Game& game, int arbitary) 
        {
            if (arbitary == 1)
            std::cout << "switching to playing state" << std::endl;
            game.state_ = &GameState::play;
        }

编辑:感谢您的回复,我认为 getter 和 setter 是要走的路。我很抱歉问题不清楚。 问题是我不理解我试图遵循的实现。我仍然不明白,但显然有办法完成同样的事情。

【问题讨论】:

  • 只是说“这不起作用”是一个非常糟糕的问题描述。 如何它不起作用?也请read about how to ask good questions.
  • 你还没有展示你是如何使用这些类的。
  • 我添加了一个简单的例子来说明我想如何使用它。这在链接中显示为可行。
  • 你的问题不是已经被问到并回答了here吗?
  • 恐怕这是一个不同的问题。不过,我感谢大家的意见。

标签: c++ class scope state


【解决方案1】:

我看到了两种可能的解决方案。

使用朋友类

您可以在 Game 类中声明 friend 类。

类似:

class Game {
 public:
  // ...
 private:
  // ...
  friend class Introduction;
};

这样Introduction类就可以访问Game类的私有成员并对其进行修改。


Getter 和 Setter

如果你想保留数据隐藏原则,你可以只提供一个公共成员来修改你的游戏状态。

这里是一个例子:

class Game {
 public:
   void setNewState(GameState* setter) noexcept;
   const GameState* getCurrentState() const noexcept;
   // ...
};

【讨论】:

  • 使用 Getters 和 Setters 应该是第一优先解决方案,因为使用 Friend Functions 是违反封装原则的,应尽可能避免.
  • 这取决于设计选择。有时 OOP 只是代价高昂的重载。如果这两个类严格接近,friend 可能是一个不错的选择。一般来说,你的设计是面向对象的,那么你是绝对正确的!保持封装原则,使用getter和setter。
【解决方案2】:

getter 和 setter 怎么样?

class Game
{
public:

   ....
   GameState * getGameState() const { return state_; }

   void setGameState(GameState * newState) { state_ = newState; }

   ....

private:

    GameState* state_;
}

【讨论】:

    【解决方案3】:

    您可以将指针设为 Protected 并使 Game 成为 GameState 的朋友,以允许 Game 访问 GameState 中的受保护成员。 但正如上述 cmets 所指出的,您实际上在问什么并不是很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多