【发布时间】:2020-04-09 15:51:21
【问题描述】:
#include <iostream>
class Piece {
public:
virtual char get()=0;
virtual ~Piece() {};
};
class One : public Piece {
public:
char get() { return '1'; }
};
class Two : public Piece {
public:
char get() { return '2'; }
};
class Tile {
private:
Piece* occ;
bool prs;
public:
Tile() { prs = false; }
void setOcc(Piece* p) { prs = true; occ = p; }
Piece& getOcc() { return *occ; }
bool getPrs() { return prs; }
void explicitDest() { if (prs) { delete occ; prs = false; } }
};
class Board {
private:
Tile tiles[2][2];
public:
Board() {
tiles[0][0].setOcc(new One());
tiles[0][1].setOcc(new Two());
tiles[1][1].setOcc(new One());
}
Tile getTile(int c, int r) { return tiles[c][r]; }
void move(Board* b, int c1, int r1, int c2, int r2) {
switch(b->tiles[c1][r1].getOcc().get()) {
case '1': b->tiles[c2][r2].setOcc(new One()); break;
case '2': b->tiles[c2][r2].setOcc(new Two()); break;
}
b->tiles[c1][r1].explicitDest();
}
void print() {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
if (tiles[j][i].getPrs()) {
std::cout << tiles[j][i].getOcc().get() << " ";
} else {
std::cout << "- ";
}
}
std::cout << "\n";
}
std::cout << "\n";
}
Board* copyBoard() { return new Board(*this); }
};
int main()
{
Board* oldBoard = new Board();
std::cout << "Old board: \n";
oldBoard->print();
Board* newBoard = oldBoard->copyBoard();
std::cout << "New board: \n";
newBoard->print();
newBoard->move(newBoard, 0, 0, 1, 1);
std::cout << "Old board after move: \n";
oldBoard->print();
std::cout << "New board after move: \n";
newBoard->print();
delete[] newBoard;
}
这是一个 MRE,用于说明我一直用来进行深度复制的方法。它并不完全有效,只是为了形象化我一直在做的事情。
使用这个例子,我的深度复制方法是否强大?如果不是,有哪些方法可用于 C++03 约束以确保副本(以及对副本的更改)不会反映在它所基于的原始版本上?
在代码中,我定义了explicitDest(),这是我显式(并且仅显式)调用析构函数的方式,因为我有时只需要某些行为。以防万一有人问。
如果代码不明显,我对复制、复制构造函数或抽象类/方法不是很熟悉。
【问题讨论】:
-
您缺少 Tile 和 Board 的复制构造函数。
-
@user1810087 你能详细说明一下答案吗?
-
你为什么不使用复制构造函数而不是
copyBoard?你想如何复制Piece实例? -
添加此支持通过基类指针删除:
virtual ~Piece() = default; -
好的,但
~Tile()肯定不见了。您不会删除Pieces。您或许应该使用std::unique_ptr。
标签: c++ copy copy-constructor deep-copy c++03