0

私は小さなOOPアプリを書いていて、セッターを介してクラスのプライベート文字列変数を設定する際にアプリを実行している(コンパイルしていない)ときにクラッシュしました。ヘッダーファイルは次のとおりです。

class Car
{
private:
int year;
std::string brand;
std::string model;
int price;
std::string currency;
public:
int setYear(int x){this->year = x;}
std::string setBrand(std::string x){this->brand = x;}
std::string setModel(std::string x){this->model = x;}
int setPrice(int x){this->price = x;};
std::string setCurrency(std::string x){this->currency = x;}
};

n - オブジェクトの数 temp - 整数を渡すための一時変数 temp1 - 文字列を渡すための一時変数

ifstream fd("input.in");
int n;
fd >> n;
int temp;
string temp1;
Car A[n];
for(int i = 0; i < 3; i++)
{
    fd >> temp;
    A[i].setYear(temp);
    fd >> temp1;
    A[i].setBrand(temp1);  //Crashes Here
    fd >> temp1;
    A[i].setModel(temp1);
    fd >> temp;
    A[i].setPrice(temp);
    fd >> temp1;
    A[i].setCurrency(temp1);
}

少しテストした後、クラッシュし、コードが「ブランド」変数を設定しようとすることがわかりました。どうしたの?

4

3 に答える 3

5

配列の次元はコンパイル時に知っている必要があるため、次のようになります。

C A[n];

間違っている。

GCCは、非標準の拡張機能として可変長配列をサポートしていますが、誤ってそれらを使用している場合でも、ループはn == 3、これが必ずしも正しいことを明確に示すものではないと想定しています。

代わりに、ベクトルを使用してください。

std::vector<C> A(n);

そしてそれを適切に繰り返します:

std::vector<C>::iterator it = A.begin(), end = A.end();
for ( ; it != end; ++it) {
   // your for loop stuff with *it
}

または、C ++ 11の場合:

for (auto& a : A) {
   // your for loop stuff with a
}
于 2012-12-31T14:50:08.113 に答える
1

CarLightness の回答に加えて、クラスのメソッドには戻り値の型がありますが、return ステートメントがないことに気付きました。通常、実行時エラーはほとんどのコンパイル エラーに影を落としているため、注意を払わなかったのはおそらくそのためです。これを解決するには、「set」メソッドの戻り値を に置き換えます。これvoidは、関数が何も返さないことを意味します。すべてのメソッドに return ステートメントがないため、これをすべてのメソッドに対して実行します。

于 2012-12-31T15:10:44.177 に答える
0

コンパイル時エラーが発生しなかったのはなぜですか? n はコンパイル時に不明であるため、以下のステートメントはエラーを引き起こすはずです。A を std::vector として作成するか、「n」にマクロ定義または static const を使用する必要があります。

    Car A[n];

さらに、セッター関数の戻り値は必要ありません。関数のシグネチャはそうすべきであることを示していますが、何も返しません。

于 2012-12-31T18:56:34.503 に答える