编译器在c ++中遇到多态类问题

时间:2013-05-23 00:17:38

标签: c++ compiler-errors

我正在研究一个正在进行的c ++类的项目,我无法弄清楚一些编译器错误。我的文件应该写一个基类精灵,它具有多态函数绘制,其他4个类继承。但是我无法弄清楚这些编译器问题!

  

main.cpp:在函数中?main()â€:

     

main.cpp:72:47:警告:扩展初始化列表仅可用   -std = c ++ 0x或-std = gnu ++ 0x [默认启用]

     

main.cpp:72:47:错误:从初始化列表

分配给数组      

main.cpp:73:23:错误:在'之前预期的primary-expression)   令牌

     

main.cpp:74:21:错误:在'之前预期的primary-expression)   令牌

     

main.cpp:75:22:错误:在'之前预期的primary-expression)   令牌

     

main.cpp:76:20:错误:在'之前预期的primary-expression)   令牌

     

main.cpp:81:13:警告:删除数组--Sprite数组[4]†  [默认启用]

这是我的代码!

#include "drawing.h"
class Sprite
{
  friend class Shadow;
  friend class Speedy;
  friend class Bashful;
  friend class Pokey;
private:
  int row;
  int col;
public:
  int getCol()
  {
    return col;
  }
  int getRow()
  {
    return row;
  }
  void setPosition(int x, int y)
  {
    row = x;
    col = y;
  }
  virtual void draw()
  {
    drawErrorMessage(row, col);
  }
};

class Shadow: public Sprite
{
public:
  virtual void draw()
  {
    drawShadow(row,col);
  }
};
class Speedy: public Sprite
{
public:
  virtual void draw()
  {
    drawSpeedy(row,col);
  }
};

class Bashful: public Sprite
{
public:
  virtual void draw()
  {
    drawBashful(row,col);
  }
};
class Pokey: public Sprite
{
public:
  virtual void draw()
  {
    drawPokey(row,col);
  }
};

int main()
{
  Sprite array[4];
  beginDrawing();
  array = {Shadow(),Speedy(),Bashful(),Pokey()};
  ((Shadow) (array[0]*)).setPosition(5,10);
 ((Speedy)(array[1]*)).setPosition(5,44);
 ((Bashful)(array[2]*)).setPosition(22,44);
 ((Pokey)(array[3]*)).setPosition(22,10);
  array[0].draw();
  array[1].draw();
  array[2].draw();
  array[3].draw();
  delete [] array;
  endDrawing();
}

1 个答案:

答案 0 :(得分:1)

您正在做的事情存在各种问题:

1)您正在尝试将初始化列表分配给数组:

array = {Shadow(),Speedy(),Bashful(),Pokey()};

这是有效的C ++ 11,但不是有效的C ++ 98。

2)即使您使用的是C ++ 11,这也是一件不幸的事情,因为将Shadow分配给Sprite会导致切片(Sprite子 - Shadow的对象将被分配,但Shadow的其余部分将不会被分配。有关其他示例,请参阅What is object slicing?

3)你正在尝试delete[]堆栈分配的数组:

Sprite array[4];
//...
delete [] array;

一般情况下,只能在delete[]的内容上致电new[]。简单(不相关)的例子:

int *arr = new int[4];
delete [] arr;

在这个问题的上下文中,你要分配数组的元素,而不是数组本身,而是你需要删除的那些(使用delete不是 delete[],因为它们已分配new而非new[])。

4)您正在尝试对动态类型为Sprite的对象进行多态调用。数组的每个元素都是Sprite。您可能意味着拥有一个Sprite*数组,然后每个元素可以指向ShadowSpeedy,或者......此时,动态类型为指向的对象将是ShadowSpeedy等,并且进行array[i]->draw()等多态调用将是有意义的。

5)此语法无效:

((Shadow) (array[0]*)).setPosition(5,10);

我假设你正在尝试(根据下面的指针数组思考)做类似的事情:

(*static_cast<Shadow*>(array[0])).setPosition(5,10);

实际上你几乎肯定只想要:

array[0]->setPosition(5,10);

一般来说,你的代码并没有做正确的事情。你可能想要更像这样的东西:

class Sprite
{
private:
    int col, row;
public:
    virtual ~Sprite() {}

    virtual void draw()
    {
        drawErrorMessage(row, col);
    }

    int getCol() const
    {
        return col;
    }

    int getRow() const
    {
        return row;
    }

    void setPosition(int row_, int col_)
    {
        row = row_;
        col = col_;
    }
};

class Shadow : public Sprite
{
public:
    /*virtual*/ void draw()
    {
        drawShadow(row, col);
    }
};

// etc.

int main()
{
    const int SPRITE_COUNT = 4;
    Sprite *array[SPRITE_COUNT];
    array[0] = new Shadow;
    array[0]->setPosition(5, 10);
    // etc.
    beginDrawing();
    for(int i = 0; i < spriteCount; ++i)
    {
        array[i]->draw();
        delete array[i]; // note: polymorphic deletion, hence the need for a virtual destructor
    }
    endDrawing();
    return 0;
}