我还有一个问题,希望能够总结我的想法.
假设我有以下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基本规则?
谢谢大家,辛迪加!
是的,在这种情况下,它似乎是合理的(“在这种情况下”我的意思是“考虑到我可以猜测你的GameEngine和Board类的语义以及它们的关联/聚合关系的性质”):
Board中的对象GameEngine。unique_ptr在这种情况下可能是您想要的,因为所有其他别名似乎只是观察者,并且板对象的生命周期绑定到该对象之一GameEngine。但是,如果需要共享所有权,请选择shared_ptr. 只是尽量不要使用原始指针、new和delete,因为它们会导致错误代码;Board来修改板,因为Player将无法访问其私有成员变量(并且board恰好是一个)。#define使用constexpr板尺寸值而不是s(如果您使用的是 C++11)。您可能还想考虑使用Boost.MultiArray创建安全的二维 C 样式数组。