2016-04-14 30 views
-3

oluşturulan nesne geçmesi bir temel sınıf şekil ve dikdörtgen ve daire gibi birkaç alt sınıfları türetilen. Tüm Şekiller 2d vektöründe, başka bir 2d vektörüne göre karakterlerle saklanmalıdır (her karakter, 'o' -> Daire gibi bir şekli temsil etmektedir).C++ - yöntem

yöntem addShapeAtEndOfLine (şekil s, vektör * çizgi) vektörüne nesne itmelidir:

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); 
     } 
    } 
    } 
} 

başlık dosya i böyle bir vektör var:

vector < vector <Shape> > field; 

Ne yazık ki bu işe yaramıyor çünkü Daire/Dikdörtgen kurucusunun bir referansa ihtiyacı var gibi görünüyor:

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

zaman bu hata iletisini derlemeye çalışıyor: (bir referans olduğu için) Bu kullandığınızda

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

bunun yerine işleri:

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

mı bir fikrim var neden bu değil Yöntemi nesnede oluşturduğumda çalışıyorum, bunu yapmak için neler yapabileceğimi söyler misiniz? Yardım için

teşekkürler!

+2

Sizin şeyi yanlış yapıyor. Nesne dilimlemeye bakın. – NathanOliver

+0

'b' nedir? Duvar nedir? – aschepler

+0

İstediğiniz için teşekkürler -/edit. –

cevap

0

addShapeAtEndOfLine() yönteminiz ve vector<Shape> öğeleriniz, yalnızca Shape numaralı betonla çalışarak, herhangi bir alt nesne ile kullanılmamalıdır. Polimorfizmi öldüren nesneleriniz slicing'dur. Dilimleme! Sizin vector yerine Shape* işaretçiler tutmak gerekiyor.

Ayrıca size Game() yapıcı bir bellek sızıntısı var. Sen currentLine veya tutan Shape nesneleri kurtararak değildir. Bunun yerine, yığın istifi üzerine currentLine bildirmek ve yerine std::unique_ptr<Shape> nesneleri tutmak için bir değiştirin. Bu şekilde, bellek yönetimi konusunda endişelenmenize gerek yok.

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... 
    } 
} 
İlgili konular