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

除了 Lightness 的回答,我注意到你的Car类的方法有返回类型但没有返回语句。运行时错误通常会掩盖大多数编译错误,所以这可能就是它没有引起您注意的原因。要解决此问题,请将“set”方法的返回值替换为void,这意味着该函数不返回任何内容。对所有方法执行此操作,因为它们都缺少返回语句。

于 2012-12-31T15:10:44.177 回答
0

它怎么没有给出任何编译时错误?下面的语句应该会导致错误,因为 n 在编译时是未知的。您应该将 A 作为 std::vector 或使用宏定义或静态 const 来表示“n”。

    Car A[n];

此外,setter 函数不需要任何返回值。尽管函数签名表明它们应该返回,但它们不返回任何内容。

于 2012-12-31T18:56:34.503 回答