在创建对象时引用会更改值

时间:2019-06-22 17:53:42

标签: c++

在运行一些使用引用的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类中的第二个构造函数,如果我不使用“ &&”符号,则会给我一个错误。 在这种情况下可能是什么问题?我认为这与我处理引用的方式有关,但是我不明白为什么。

1 个答案:

答案 0 :(得分:2)

您通过引用返回所有内容。在需要调整向量的大小之前,这很好,这将重新分配向量的内存并使对该内存的所有引用无效。包括您的newValue参考。结果,您的const int& newValue指向了包含随机数据的内存,这是一个奇迹,您的程序根本不会崩溃。

在不需要参考时停止使用参考:

newValue = myClass.getFinalClassByIndex(temp).getInt();

int getInt(){ return myInt; }

更好:

auto getInt(){ return myInt; }