2017-03-02 3 views
1

Ich wollte Schlacht Spiel schreiben, aber ich habe einige Probleme, wenn es Aspekt OOP kommt ... Zunächst einmal habe ich Battlefield KlassePassing Klassenattribut funktionieren

class Battlefield 
{ 
private: 
    string **array; 
public: 
    Battlefield(); 
    ~Battlefield(); 
    void createBattlefield(); 
    void drawBattlefield(); 
    string getArray(); 
}; 

Constructor

Battlefield::Battlefield() 
{ 
    array = new string*[12]; 
    for (int i = 0; i < 12; i++){ 
     array[i] = new string[12]; 
    } 
} 

getArray()

string Battlefield::getArray() 
{ 
    return **array; 
} 

Zweite Klasse ist Game, wo bis jetzt bekam ich nur eine Methode shoot()

void Game::shoot(string **array) 
{  
    char row; 
    int column; 

     cout << endl << "Row (A, B, ... , J): "; 
     do{ 
      cin >> row; 
      if (islower(row)) row = toupper(row); 
      if (row > 'J' || row < 'A'){ 
       cout << "Row out of range!" << endl << "Try again: "; 
      } 

     } while (row > 'J' || row < 'A'); 

     cout << "Column (1, 2, ... , 10): "; 
     do{ 
      cin >> column; 
      if (column > 10 || column < 1){ 
       cout << "Column out of range!" << endl << "Try again: "; 
      } 
     } while (column > 10 || column < 1); 

     array[(int)(row - 64)][column] = "[.]"; 
} 

Welche basicly nur Orte [.] In array [x] [y] Aber Im habe Probleme bekommen dies zu zusammenarbeiten, um in main

int main() 
{ 
    Battlefield array; 
    Game game; 

    array.createBattlefield(); 

    game.shoot(array.getArray()); 
} 

letzte Zeile verursacht

Fehler C2664: 'Leeres Spiel :: schießen (std :: string **)': kann nicht Argument 1 von 'std :: string' auf 'std :: string **'

+2

Die Fehlermeldung sehr klar sein sollte, wenn man es nur lesen. Denken Sie darüber nach, was 'getArray' *** wirklich *** zurückgibt. Hinweis: Es ist kein Array. –

+3

In einer etwas verwandten Anmerkung, wenn Sie eine feste Größe Anzahl von Strings und Arrays von Strings zuweisen, dann empfehle ich ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) stattdessen. –

+0

Verwenden Sie nicht "neu", bevor Sie mindestens 20 Jahre Erfahrung in C++ haben. – nwp

Antwort

2
  1. konvertieren Die getArray() gibt eine Zeichenfolge zurück, d. e. a 1D Char-Array und Game::shoot() erwartet ein 3D-Char-Array, daher der Fehler. Wenn ich Sie richtig verstanden habe und Sie ein 2D-Schlachtfeld zurückgeben möchten, wie in Battleship game, müssen Sie char** oder vector<vector<char>> oder vector<string> erstellen, die alle 2D-Char-Arrays sind.
  2. Die string** array ist keine 2D-Matrix, es ist ein 3D, soweit ich das verstehe.
  3. Verwenden Sie nicht cpp-Zeichenfolge und c-style Zeiger zusammen, es ist eine wirklich fehleranfällige Ansatz, ich. e. string** ist ein Greuel, Sie sollten es sofort löschen und niemals wieder solche Konstrukte verwenden.
  4. Wenn Sie große Objekte wie 2D-Matrizen übergeben möchten, sollten Sie das Kopieren wirklich vermeiden und es vorziehen, sie per Zeiger, Verweis oder mithilfe von Move-Konstruktoren zu übergeben.
  5. Vermeiden Sie neue, verwenden Sie Objekte auf Stapel oder lassen Sie boost, Qt oder std::unique_pointer den Speicher für Sie verwalten.
  6. Warum ist row ein char und ein column ist vom Typ int? Versuchen Sie, hier 16 Bit Speicher zu speichern? Es ist es nicht wert und ist sehr verwirrend.
  7. Versuchen Sie, zu allgemeine Namen wie array zu vermeiden, vertrauen Sie mir, wenn Sie mehr als 5k Zeilen Code haben, wird es sehr schwer sein, sich zu erinnern, welches Array es ist. Nutzen Sie diese Gelegenheit, um Ihren Code lesbarer zu machen.
  8. Ich denke, die Game Klasse die Battlefield Klasse in sich selbst schaffen sollte, vielleicht kann es einen Vektor von Battlefield s enthalten, wenn Sie davon ausgehen, dass mehr als ein Battlefield in Spiel sein kann, aber es ist in der Regel bis zu Ihnen.
  9. Was Sie in Battlefield 's Konstruktor tun, ist ein absolut unnötiges Stück Code, IMO. Vektoren und Strings behandeln ihre Größe für Sie, Sie können Größenbeschränkungen als Mitglieder der Klasse Battlefield hinzufügen, nur um Ihre Spiellogik aufrecht zu erhalten, aber den Vektor so zu beschränken, dass nur n Elemente verwendet werden Bein und zwingt es zum Tanzen.
  10. Trotz all dieser kleinen Fehler, geht es Ihnen gut! Wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen.

Also, das ist eine Probe von dem, was Sie schreiben können:

class Battlefield 
{ 
private: 
    vector<string> mField; 
public: 
    Battlefield(); 
    ~Battlefield(); 
    void createBattlefield(); 
    void drawBattlefield(); 
    vector<string>& getArray(); 
}; 

Battlefield::Battlefield() {} 

void Game::shoot(vector<string>& field) 
{  
    int row; 
    int column; 
    // your logic goes here 
} 

int main() 
{ 
    Battlefield field; 
    Game game; 

    field.createBattlefield(); 

    game.shoot(array.getArray()); 
} 
Verwandte Themen