c ++ OOP设计 - 将数据成员传递给其他类 - 这是否合理?

Syn*_*BBB 6 c++

我还有一个问题,希望能够总结我的想法.

假设我有以下3个类:

班级球员:

class Player {
private:
    int positionX, positionY;
public:
    void move(Board& b) {
      // player changes its position on the board(move)
      b.removeCharFromBoard(positionX, positionY);
      positionX++;
      positionY++;
      // 'P' indicates a Player in the Board....
      b.insertCharToBoard(positionX, positionY, 'P');
    }
};
Run Code Online (Sandbox Code Playgroud)

班主任:

class Board {
private:
    // BOARD_C and BOARD_R are both "#define ..." for some integer number.
    char board[BOARD_C][BOARD_R];
};
Run Code Online (Sandbox Code Playgroud)

class GameEngine:

class GameEngine {
private:
     Board* board;
public:
     void playTurn(const Player& p) {
        p.move(board);
     }
};
Run Code Online (Sandbox Code Playgroud)

你认为GameBoard的playTurn函数会用参数"board"调用Player的移动功能似乎是合理的吗?我需要这样做才能在棋盘数据成员中标记玩家已经改变了他的位置.它是否遵守OOP基本规则?

谢谢大家,辛迪加!

And*_*owl 4

是的,在这种情况下,它似乎是合理的(“在这种情况下”我的意思是“考虑到我可以猜测你的GameEngineBoard类的语义以及它们的关联/聚合关系的性质”):

  1. 而是使用智能指针而不是原始指针来保存Board中的对象GameEngineunique_ptr在这种情况下可能是您想要的,因为所有其他别名似乎只是观察者,并且板对象的生命周期绑定到该对象之一GameEngine。但是,如果需要共享所有权,请选择shared_ptr. 只是尽量不要使用原始指针、newdelete,因为它们会导致错误代码;
  2. 您仍然需要在类的接口上提供公共函数Board来修改板,因为Player将无法访问其私有成员变量(并且board恰好是一个)。
  3. #define使用constexpr板尺寸值而不是s(如果您使用的是 C++11)。您可能还想考虑使用Boost.MultiArray创建安全的二维 C 样式数组。