将class属性传递给函数

时间:2017-03-02 08:16:50

标签: c++ oop

我想编写战舰游戏,但是在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] = "[.]";
}

哪个基本上只将[。]放在数组[x] [y]中 但是我在main

中遇到了麻烦
int main()
{
    Battlefield array;
    Game game;

    array.createBattlefield();

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

最后一行导致

  

错误C2664:&#39; void Game :: shoot(std :: string **)&#39; :无法从&#39; std :: string&#39;转换参数1到&#39; std :: string **&#39;

1 个答案:

答案 0 :(得分:2)

  1. getArray()返回一个字符串,i。即 1D字符数组Game::shoot()需要 3D字符数组,因此出错。如果我理解你并想要返回2D战场,就像在Battleship game中一样,你必须创建char**vector<vector<char>>vector<string>,所有这些都将是2D char数组。
  2. 根据我的理解,string** array不是2D矩阵,它是3D。
  3. 不要一起使用cpp-string和c-style指针,这是一种非常容易出错的方法,i。即string**是令人厌恶的,你应该立即删除它,再也不要使用这样的结构。
  4. 如果你想传递像2D矩阵这样的大对象,你应该真的避免复制,而更喜欢通过引用,引用或使用移动构造函数来传递它们。
  5. 避免使用新的,在堆栈上使用对象或让boostQtstd::unique_pointer为您管理内存。
  6. 为什么row charcolumn的类型为int?你试着在这里保存16位内存吗?这不值得,而且非常令人困惑。
  7. 尽量避免像array那样过于通用的名字,相信我,当你有超过5k行的代码时,很难记住它是哪个数组。利用这个机会使您的代码更具可读性。
  8. 我认为,Game类应该在其自身内部创建Battlefield类,如果你假设它可以包含一个Battlefield的向量,那么Battlefield可以在游戏中,但通常取决于你。
  9. 你在Battlefield的构造函数中所做的是一段绝对不必要的代码,imo。向量和字符串为您处理它们的大小,您可以将大小约束添加为Battlefield类的成员,只是为了保持游戏逻辑的正确性,但限制向量仅使用n个元素,当它可能包含任意数量的元素时就像打破它的腿,迫使它跳舞。
  10. 尽管有这些小错误,但你做的很棒!如果您有任何其他问题,请不要犹豫。
  11. 所以,这是你可以写的一个例子:

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