2017-03-02 75 views
1

我想寫戰艦的比賽,但我得到了一些麻煩,當涉及到OOP方面...首先,我Battlefield傳遞類屬性的功能

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

構造

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

的getArray()

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

第二類是Game,在那裏到現在我只有一個方法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] = "[.]"; 
} 

其中basicly只是放在[]數組[X] [Y] 但是我在遇到問題時得到這個在main

int main() 
{ 
    Battlefield array; 
    Game game; 

    array.createBattlefield(); 

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

最後一行共同努力使

錯誤C2664: '無效遊戲::拍(的std :: string **)':無法從 '的std :: string' 轉換參數1 '的std :: string **'

+2

錯誤消息應該是很清楚的,如果你只是讀它。想一想'getArray' ***真的會返回什麼。提示:這不是一個數組。 –

+3

在略有相關的說明中,如果您分配固定大小的字符串和數組字符串,那麼我建議['std :: array'](http://en.cppreference.com/w/cpp/container/array )代替。 –

+0

在C++中至少有20年的經驗之前,不要使用'new'。 – nwp

回答

2
  1. getArray()返回一個字符串,即。即一個一維字符數組Game::shoot()預計三維字符數組,因此錯誤。如果我理解你並且你想要返回2D戰場,就像在Battleship game中一樣,你必須創建char**vector<vector<char>>vector<string>,所有這些都將是2D字符數組。據我所知,不是2D矩陣,而是3D。
  2. 不要一起使用cpp-string和c-style指針,這是一個非常容易出錯的方法,即string**是一種可憎的東西,你應該馬上刪除它,而不要再使用這樣的構造。
  3. 如果你想傳遞像2D矩陣這樣的大對象,你應該避免複製,並且希望通過指針,引用或使用移動構造函數來傳遞它們。
  4. 避免在堆棧上使用新的,使用對象或讓boostQtstd::unique_pointer爲您管理內存。
  5. 爲什麼row a charcolumn的類型是int?你試圖在這裏保存16位內存嗎?這不值得,而且很混亂。
  6. 儘量避免過於籠統的名字,比如array,相信我,當你有超過5k行的代碼時,很難記住它是哪個數組。利用這個機會讓你的代碼更具可讀性。
  7. 我想,Game類應創建Battlefield類的內部本身,也許它可以包含Battlefield秒的載體,如果你認爲,不止一個Battlefield可以在遊戲,但它通常是給你的。
  8. 你在做什麼Battlefield的構造函數是絕對不必要的一段代碼,imo。矢量和字符串爲你處理它們的大小,你可以添加大小約束作爲Battlefield類的成員,只是爲了保持遊戲邏輯的正確性,但是限制矢量只使用n個元素,當它可能容納任何數字時,就像打破它腿並迫使它跳舞。
  9. 儘管所有這些小錯誤,你做得很好!如果您有任何其他問題,請不要猶豫,問。

所以,這是你可以寫什麼樣:

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