2016-04-14 12 views
-3

で作成されたオブジェクトを渡します。すべての図形は、文字を持つ別の2次元ベクトル(すべての文字は 'o' - >円のような形を表しています)に従って、2次元ベクトルに格納する必要があります。C++ - 私は、基本クラス<em>形状</em>を有し、<em>長方形</em>と<em>サークル</em>ようないくつかのサブ・クラスを派生方法

vector < vector <Shape> > field; 
:私はこのようなベクトルを持っているヘッダファイルで

void Game::addShapeAtEndOfLine(Shape s, vector<Shape>* line) 
{ 
    line->push_back(std::move(s)); 
} 

Game::Game(vector<string> game_validate) 
{ 
    for(auto it_a = game_validate.begin() + 2; it_a < game_validate.end(); it_a++) 
    { 
    vector<Shape> *currentLine = new vector<Shape>(); 

    string current_line = *it_a; 
    for (auto it_b = current_line.begin(); it_b < current_line.end(); it_b++) 
    { 
     if(*it_b == 'o') 
     { 
     addShapeAtEndOfLine(new Circle(*it_b), currentLine); 
     } else if (*it_b == '#') 
     { 
     addShapeAtEndOfLine(new Rectangle(*it_b), currentLine); 
     } 
    } 
    } 
} 

方法addShapeAtEndOfLine(形状s、ベクトル*ライン)がベクター内のオブジェクトをプッシュするべきであるに

残念ながら、Circle/Rectangleのコンストラクタが参照を必要とするように、これはうまくいきません:

Circle::Circle(char character) : Shape(character) { 
} 

私は、このエラー・メッセージが表示されるコンパイルしよう:

error: invalid conversion from 'Circle*' to 'char' [-fpermissive]

私が代わりにこれを使用する場合(これは参照だから)、それは動作します:

if(*it_b == 'o') 
{ 
    Shape* c = new Circle('o'); 
    addShapeAtEndOfLine(*c, currentLine); 
} 

あなたはなぜこのISNアイデアを持っていますかそれぞれのメソッドでオブジェクトを作成するときに作業していますが、私はそれを動作させるために何ができるのか教えてください。

ありがとうございました!

+2

あなたはそれをすべて間違っています。オブジェクトのスライスをルックアップします。 – NathanOliver

+0

'b'とは何ですか? '壁'とは何ですか? – aschepler

+0

ありがとうございました - /編集。 –

答えて

0

addShapeAtEndOfLine()メソッドとvector<Shape>の両方が、コンクリートShapeオブジェクトでのみ動作し、子孫オブジェクトでは動作しません。多形性を殺すあなたのオブジェクトはslicingです。スライスしないでください!あなたのvectorは代わりにポインタShape*を保持する必要があります。

また、Game()コンストラクタにメモリリークがあります。 currentLineまたはそれが保持するShapeオブジェクトを解放していません。ヒープの代わりにcurrentLineをスタックに宣言し、代わりにstd::unique_ptr<Shape>のオブジェクトを保持するように変更します。この方法では、メモリ管理について心配する必要はありません。

void Game::addShapeAtEndOfLine(Shape *s, vector<std::unique_ptr<Shape>> &line) 
{ 
    line.emplace_back(s); 
    // or: line.push_back(std::unique_ptr<Shape>(s)); 
} 

Game::Game(vector<string> &game_validate) 
{ 
    for(auto it_a = game_validate.begin() + 2; it_a != game_validate.end(); ++it_a) 
    { 
     vector<std::unique_ptr<Shape>> currentLine; 

     for (auto it_b: *it_a) 
     { 
      switch (it_b) 
      { 
       case 'o': 
        addShapeAtEndOfLine(new Circle(it_b), currentLine); 
        break; 

       case '#': 
        addShapeAtEndOfLine(new Rectangle(it_b), currentLine); 
        break; 
      } 
     } 

     // use currentLine as needed... 
    } 
} 
関連する問題

 関連する問題