0

Java から来て、単純な戦艦ゲームを C++ で実装しようとしていましたが、既にこの配列で行き詰まりました:

#include <iostream>
#include <utility>

using namespace std;

class Ship{
    private:
        int length;
        bool direction; //false = left, true = down
        pair <int,int> coords[];
    public:
        Ship(int x, int y, bool, int);
        void printship();
};

Ship::Ship(int x, int y, bool dir, int l){ 
    pair <int,int> coords[l];
    length = l;
    if (dir){
        for (int i = 0; i < l; i++){
            coords[i] = make_pair(x, y+i);
        }   
    }   
    else{
        for (int i = 0; i < l; i++){
            coords[i] = make_pair(x+i, y); 
        }   
    }   
}
void Ship::printship(){
    for (int i = 0; i < length; i++){
        cout << "x: " << coords[i].first << ", y: " << coords[i].second << endl;
    }   
}

int main(){
    Ship tests(2,3,true,3);
    tests.printship();
    return 0;
}

私が得るものは次のとおりです。

x: 134515168, y: 0
x: 0, y: 9938131
x: 1, y: -1080624940

何かが未割り当てのメモリを指していると思いますが、何が、なぜなのかわかりません。

4

2 に答える 2

6

という名前の 2 つの異なる変数がありますcoords。1 つはプライベート メンバー変数で、もう 1 つはコンストラクターに対してローカルです。コンストラクターで作成したローカル変数はメンバー変数をシャドウするため、コンストラクターはメンバー変数を初期化しません。

代わりにこれを試してください:

#include <iostream>
#include <utility>
#include <vector>

using namespace std;

class Ship{
    private:
        int length;
        bool direction; //false = left, true = down
        vector< pair <int,int> > coords; // *** CHANGE HERE
    public:
        Ship(int x, int y, bool, int);
        void printship();
};

Ship::Ship(int x, int y, bool dir, int l){ 
    length = l;
    if (dir){
        for (int i = 0; i < l; i++){
            coords.push_back(make_pair(x, y+i)); // *** CHANGE HERE
        }   
    }   
    else{
        for (int i = 0; i < l; i++){
            coords.push_back(make_pair(x+i, y)); // *** CHANGE HERE
        }   
    }   
}
void Ship::printship(){
    for (int i = 0; i < length; i++){
        cout << "x: " << coords[i].first << ", y: " << coords[i].second << endl;
    }   
}

int main(){
    Ship tests(2,3,true,3);
    tests.printship();
    return 0;
}
于 2012-09-13T22:47:24.867 に答える
1

coordsコンストラクターには、メンバー変数の代わりに初期化するローカル変数があります。vectorまた、メモリの割り当てと解放について心配する必要がないため、おそらく配列の代わりに aaを使用する必要があります。

class Ship{
private:
    bool direction; //false = left, true = down
    vector<pair<int,int>> coords;
public:
    Ship(int x, int y, bool, int);
    void printship();
};

Ship::Ship(int x, int y, bool dir, int l){ 
    if (dir){
        for (int i = 0; i < l; i++){
           coords.push_back(make_pair(x, y+i));
        }   
    }   
    else{
        for (int i = 0; i < l; i++){
           coords.push_back(make_pair(x+i, y)); 
        }   
    }   
}

void Ship::printship(){
    for (vector<pair<int, int>>::iterator it = coords.begin(); it != coords.end(); ++it)
        cout << "x: " << it->first << ", y: " << it->second << endl;
    }   
}
于 2012-09-13T22:59:57.580 に答える