在运行一些使用引用的C ++代码时遇到一些奇怪的错误。基本上我有三个类,第一个包含第二个对象,而第二个包含第三类对象的向量。这是示例代码:
class MainClass {
public:
SecondaryClass myClass;
private:
void myFunction() {
int temp = 0;
const int& newValue = myClass.getFinalClassByIndex(temp).getInt();
// I add another FinalClass with the same value
myClass.addClassToVector(newValue);
// I try to add another one but the variabile "newValue" has another value
myClass.addClassToVector(newValue);
}
};
class SecondaryClass {
public:
SecondaryClass() {
myVector.push_back(FinalClass(0));
}
private:
std::vector<FinalClass> myVector;
void addClassToVector(const int& value) {
myVector.push_back(FinalClass(value));
}
FinalClass& getFinalClassByIndex(const int& index) {
return myVector.at(index);
}
};
class FinalClass {
public:
FinalClass(const int& value) : myInt(value){}
FinalClass(const int&& value) : myInt(value){}
const int& getInt(){ return myInt; }
private:
int myInt;
};
这是我运行“ myFunction”时发生的情况:我从向量myVector中的第一个对象获取整数值,并将其放入newValue变量中。然后,我尝试使用addClassToVector方法创建两个新的FinalClass对象,这两个对象将具有与第一个相同的整数值。
正确创建了第一个新对象(将是向量中的第二个对象);当我尝试创建第二个对象(向量中的第三个对象)时,newValue变量没有应有的值0,但它具有完全不同的值。值似乎已被移动,而不是被复制到新类中。
当我创建类似“ FinalClass(0)”的类时,将使用FinalClass类中的第二个构造函数,如果我不使用“ &&”符号,则会给我一个错误。
在这种情况下可能是什么问题?我认为这与我处理引用的方式有关,但是我不明白为什么。
答案 0 :(得分:2)
您通过引用返回所有内容。在需要调整向量的大小之前,这很好,这将重新分配向量的内存并使对该内存的所有引用无效。包括您的newValue
参考。结果,您的const int& newValue
指向了包含随机数据的内存,这是一个奇迹,您的程序根本不会崩溃。
在不需要参考时停止使用参考:
newValue = myClass.getFinalClassByIndex(temp).getInt();
和
int getInt(){ return myInt; }
更好:
auto getInt(){ return myInt; }