-1

使用している C++ クラスのプロジェクトに取り組んでいますが、いくつかのコンパイラ エラーがわかりません。私のファイルは、他の4つのクラスが継承する多態性関数 draw を持つ基本クラスのスプライトを記述することになっています。しかし、私はこれらのコンパイラの問題を理解できません!

main.cpp: 関数「int main()」内:

main.cpp:72:47: 警告: 拡張イニシャライザ リストは -std=c++0x または -std=gnu++0x [デフォルトで有効] でのみ使用可能

main.cpp:72:47: エラー: 初期化子リストから配列に割り当てています

main.cpp:73:23: エラー: ')' トークンの前にプライマリ式が必要です

main.cpp:74:21: エラー: ')' トークンの前にプライマリ式が必要です

main.cpp:75:22: エラー: ')' トークンの前にプライマリ式が必要です

main.cpp:76:20: エラー: ')' トークンの前にプライマリ式が必要です

main.cpp:81:13: 警告: 配列「スプライト配列 [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();
}
4

1 に答える 1

1

あなたがしていることにはさまざまな問題があります:

1) 初期化子リストを配列に割り当てようとしています:

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

これは有効な C++11 ですが、有効な C++98 ではありません。

2) C++11 を使用していたとしても、aShadowに aを代入するSpriteとスライスが発生するため、これは残念なことです (のSpriteサブオブジェクトはShadow代入されますが、残りは代入されShadowません)。 . オブジェクトのスライスとはを参照してください。追加の例については。

delete[]3)スタック割り当て配列にしようとしています:

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

一般的には、自分が呼び出しdelete[]ているものだけを呼び出しますnew[]。簡単な (無関係な) 例:

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

この質問のコンテキストでは、配列自体ではなく、配列の要素deleteを割り当てています。これは、削除する必要がある要素です ( and not delete[]で割り当てられているため、 and not を使用しnewていnew[]ます)。

4) 動的型が であるオブジェクトに対してポリモーフィック呼び出しを行おうとしていますSprite。配列のすべての要素はSprite. おそらく、 の配列を持つことを意味しSprite*、各要素はShadow、または、Speedyまたは ...のいずれかを指すことができます。などの意味があります。ShadowSpeedyarray[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;
}
于 2013-05-23T00:20:23.643 に答える