我有一个装满小雕像的游戏板。
已分配:
board = new Figure*[boardSize];
for (int i = 0; i < boardSize; ++i) board[i] = new Figure[boardSize];
for (int i = 0; i < boardSize; ++i)
{
for (int j = 0; j < boardSize; ++j)
{
FreeSpot F( i,j );
board[i][j] = F;
}
}我有两节课
图:
class Figure {
public:
Figure ( );
~Figure ( void );
virtual void print ( ostream & os ) const;
friend ostream & operator << ( ostream & os, const Figure & F );
int positionX;
int positionY;
private:
};
void Figure::print ( ostream & os ) const {
os << "[" << positionY << "," << positionX << "]";
}
ostream & operator << ( ostream & os, const Figure & f ) {
f . print ( os );
return ( os );
}作为一个孩子,FreeSpot:
class FreeSpot: public Figure {
public:
FreeSpot ( int, int );
~FreeSpot ( void );
virtual void print ( ostream & os ) const;
friend ostream & operator << ( ostream & os, const FreeSpot & F );
char shape;
private:
};
void FreeSpot::print ( ostream & os ) const {
os << "[" << positionY << shape << positionX << "]";
}
ostream & operator << ( ostream & os, const FreeSpot & f ) {
f . print ( os );
return ( os );
}问题是,如果我试图从电路板上计算FreeSpot对象,它会取走大量的图形。
cout << board[i][j];我做错什么了吗?非常感谢。
发布于 2015-05-20 07:49:26
那是因为object slicing。
board是Figure的容器。所以当你这样做的时候:
FreeSpot F( i,j );
board[i][j] = F;你将一个FreeSpot压缩到一个图形中。F的图形子对象将被复制到电路板中,但FreeSpot特定的属性将丢失。所以结果将是一个Figure。
这就是为什么尽管您调用了多态print(),但最终只能打印图形。
解决方案
你必须创建一个指向元素的指针数组。或者更好:shared_ptr。你不会再遭受切片的痛苦了。内存管理将变得更容易:
const int boardSize=8;
vector< vector< shared_ptr<Figure> > > board(boardSize, vector<shared_ptr<Figure>>(boardSize));
for (int i = 0; i < boardSize; ++i) {
for (int j = 0; j < boardSize; ++j) {
board[i][j] = static_pointer_cast<Figure>(make_shared<FreeSpot>(i,j));
cout << *board[i][j]<< " ";
}
cout<<endl;
}https://stackoverflow.com/questions/30337806
复制相似问题