首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子对象上的ostream获取其父对象的ostream

子对象上的ostream获取其父对象的ostream
EN

Stack Overflow用户
提问于 2015-05-20 07:24:48
回答 1查看 57关注 0票数 0

我有一个装满小雕像的游戏板。

已分配:

代码语言:javascript
复制
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;
    }
}

我有两节课

图:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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对象,它会取走大量的图形。

代码语言:javascript
复制
cout << board[i][j];

我做错什么了吗?非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2015-05-20 07:49:26

那是因为object slicing

boardFigure的容器。所以当你这样做的时候:

代码语言:javascript
复制
    FreeSpot F( i,j );
    board[i][j] = F;

你将一个FreeSpot压缩到一个图形中。F的图形子对象将被复制到电路板中,但FreeSpot特定的属性将丢失。所以结果将是一个Figure

这就是为什么尽管您调用了多态print(),但最终只能打印图形。

解决方案

你必须创建一个指向元素的指针数组。或者更好:shared_ptr。你不会再遭受切片的痛苦了。内存管理将变得更容易:

代码语言:javascript
复制
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; 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30337806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档