设置类变量时代码崩溃
Posted
技术标签:
【中文标题】设置类变量时代码崩溃【英文标题】:Code crashes on setting class variable 【发布时间】:2012-12-31 14:48:21 【问题描述】:我只是在编写一个小的 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);
经过小小的测试,我发现它崩溃了,然后代码尝试设置“品牌”变量。有什么问题?
【问题讨论】:
i < 3
? 3 是从哪里来的?
请查看数组和向量之间的区别,您违反了编码中的基本规则。我首先建议使用向量,但是如果您坚持使用数组,那么您将需要在这种情况下动态分配内存。
【参考方案1】:
数组维度必须在编译时知道,所以:
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
【讨论】:
因为他在向量中设置东西,所以他需要一个用于 for(auto &a : A) 示例的 ref。 @Ryan:没错。顺便说一句,我去过博尔德;好地方。【参考方案2】:除了 Lightness 的回答,我注意到您的 Car
类的方法有返回类型但没有返回语句。运行时错误通常会掩盖大多数编译错误,所以这可能就是它没有引起您注意的原因。要解决此问题,请将“set”方法的返回值替换为void
,这意味着该函数不会返回任何内容。对所有方法执行此操作,因为它们都缺少返回语句。
【讨论】:
不过,关于回报的好地方。【参考方案3】:它怎么没有给出任何编译时错误?下面的语句应该会导致错误,因为 n 在编译时是未知的。您应该将 A 作为 std::vector 或使用宏定义或静态 const 来表示“n”。
Car A[n];
此外,setter 函数不需要任何返回值。尽管函数签名表明它们应该返回,但它们不会返回任何内容。
【讨论】:
带有愚蠢的松散编译标志 GCC 将尝试在某些情况下使用 VLA。以上是关于设置类变量时代码崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃