c++ - 用于创建对象时引用更改值

标签 c++

我在运行一些使用引用的 C++ 代码时遇到了一些奇怪的错误。基本上我有三个类,第一个包含第二个的对象,而第二个包含第三个类的对象的 vector 。这是示例代码:

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”时发生的情况:我从 vector myVector 中的第一个对象获取整数值,并将其放入 newValue 变量中。然后我尝试使用 addClassToVector 方法创建两个新的 FinalClass 对象,这两个对象将具有与第一个相同的整数值。
正确创建了第一个新对象(即 vector 中的第二个对象);当我尝试创建第二个对象( vector 中的第三个对象)时,newValue 变量没有应有的值 0,但它有一个完全不同的值。似乎该值已被移动而不是复制到新类中。
当我创建像“FinalClass(0)”这样的类时,会使用类 FinalClass 中的第二个构造函数,如果我不使用“&&”符号,它会给我一个错误。 在这种情况下可能出现什么问题?我认为这与我处理引用的方式有关,但我不明白为什么。

最佳答案

您通过引用返回所有内容。这很好,直到您的 vector 需要调整大小,这会重新分配您的 vector 内存并使对该内存的所有引用无效。包括您的 newValue 引用。结果,您的 const int& newValue 指向内存,其中包含随机数据,您的程序根本没有崩溃就是一个奇迹。

在不需要时停止使用引用:

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

int getInt(){ return myInt; }

更好:

auto getInt(){ return myInt; }

关于c++ - 用于创建对象时引用更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56717807/

相关文章:

C++ 获取 vector 中 const char* [ ] 的长度

C++:为什么 weak_ptr 没有 shared_ptr&& 构造函数?

c++ - 在全局空间中访问的私有(private)静态对象

c++ - 如何在不复制的情况下从字符串流中获取字符?

c++ - RAII 对象 tr1 :shared_ptr

c++ - 意外的指针行为

c++ - 从 unsigned char* 到 char* 的无效转换

c++ - 在 QML 上下文中处理 Qt C++ 事件

c++ - 如何在C++中删除一个char指针

c# - 父类(super class)构造函数中的虚拟化