这个奇怪的问题,已经和几个同事研究过了。。。使用Qt Creator和Qt 4.8.5
- 定义对象
- 使用setter设置多个值
- 使用getter请求值
- 结果:得到一个int没有问题,所有其他值都会导致分段错误
- 但是使用调试器中的断点,值会正确显示,因此它们在对象中
-
同样的代码以前工作,问题"刚刚出现"。编译器问题?
private: int id; QString name; public; int getId() { return this->id; } // OK void setId(int id) { this->id = id; } QString getName() { return this->name; } // SIGSEGV void setName(QString name) { this->name = name; }
有什么想法吗?知道同样的问题吗?
更新
更改了代码,基于评论,仍然是相同的问题
private:
int id;
QString name;
public;
int getId() { return id; } // OK
void setId(int setTo) { id = setTo; }
QString getName() { return name; } // SIGSEGV
void setName(QString setTo) { name = setTo; }
我也面临类似的问题。虽然我找不到这个问题的根本原因,但我有另一个观察。如果我们使用范围解析运算符在类声明之外定义getter函数,那么代码就可以工作了。
QString MyClass::GetX(void) {
return mX;
}
QString MyClass::GetY(void) {
return mY;
}
class MyClass
{
public:
MyClass(){}
/* Functions for setting mX and mY strings. */
QString GetX(void);
QString GetY(void);
isDataAvailable()
{
return mAvailable;
}
private:
bool mAvailable;
QString mX;
QString mY;
};
正如我所理解的,在C++中,如果我们在类声明中定义一个函数,默认情况下它是内联的。。。因此,问题可能与函数的内联有关。
进一步思考在内存中创建对象的方式,我认为QString可能没有保留固定数量的字节,这可能是这种奇怪行为的原因,你猜怎么着,一个伪更改解决了我的问题。。。
这感觉是一个非常"肮脏"的解决方案,但至少我可以继续我的工作;-)但任何关于根本原因的想法都将不胜感激!感谢所有宝贵的评论!!!
private:
QString name; // FIRST DEFINE QSTRING
int id; // THEN DEFINE INT
public;
int getId() { return id; } // OK
void setId(int setTo) { id = setTo; }
QString getName() { return name; } // OK
void setName(QString setTo) { name = setTo; }