我只是编写小OOP应用程序,并在通过setter设置类的私有字符串变量运行(不编译)应用程序时崩溃,这是头文件:
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);
}
经过一点点测试后,我发现它崩溃然后代码试图设置“品牌”变量。有什么问题?
答案 0 :(得分: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
}
答案 1 :(得分:1)
除了Lightness的回答,我注意到你的Car
类的方法有返回类型但没有return语句。运行时错误通常会掩盖大多数编译错误,所以这可能就是为什么它没有引起你的注意。要解决此问题,请将“set”方法的返回值替换为void
,这意味着该函数不会返回任何内容。对所有方法执行此操作,因为它们都缺少返回语句。
答案 2 :(得分:0)
它是如何不给出任何编译时错误的?下面的语句应该导致错误,因为在编译时不知道n。您应该将A作为std :: vector或使用宏定义或静态const作为“n”。
Car A[n];
此外,您不需要任何setter函数的返回值。尽管功能签名表明他们应该返回,但它们不会返回任何内容。