通过类引用访问和更改矢量

Accessing and Altering Vectors through class references

本文关键字:访问 引用      更新时间:2023-10-16

这是我能解决问题的最简单的方法,很抱歉长度:

#include <vector>
#include <iostream>
class Bar
{
private:
    std::vector<int> intVector_;
public:
    Bar() {};
    void addInt(int newInt) 
    { 
        intVector_.push_back(newInt); 
        std::cout << intVector_.size() << " "; 
    };
    int getIntVectorSize() { return intVector_.size(); };
};
class Foo
{
private:
    Bar bar_;
public:
    Foo() { bar_ = Bar(); };
    Bar getBar() { return bar_; };
};
int main(char argc, char* argv[])
{
    Foo foo = Foo();
    foo.getBar().addInt(1);
    std::cout << foo.getBar().getIntVectorSize() << " ";
    foo.getBar().addInt(2);
    std::cout << foo.getBar().getIntVectorSize() << " ";
    foo.getBar().addInt(3);
    std::cout << foo.getBar().getIntVectorSize() << " ";
}

我的问题是,向向量添加int似乎只持续addInt()的持续时间。我的矢量大小输出如下:

1 0 1 0 1 0

我对C++和所有这些引用/指针业务都很陌生,所以我不知道如何解决这个问题,或者这是否可能。谢谢你的帮助!

这是因为getBar()通过返回一个Bar,这为函数的每个调用生成一个bar_的副本,并且您正在修改临时的向量。

您可以通过返回引用来避免这种情况:

class Foo
{
private:
    Bar bar_;
public:
    Foo() { bar_ = Bar(); }; // you prob. want to use an initialiser list btw.
    Bar& getBar() { return bar_; };
//     ^ notice the ampersand
};

这样,对getBar的返回值所做的任何修改都是在bar_上完成的,而不是在语句末尾销毁的临时副本。