gpt4 book ai didi

c++ - 为什么对 vector 中类成员的引用指向不同对象的相同值?

转载 作者:行者123 更新时间:2023-12-03 06:53:37 26 4
gpt4 key购买 nike

让我们有一个简单的类:

class Var
{
public:
explicit Var(const std::string& name, const double v)
: value(v), ref(value), _name(name) {};
~Var() {};

double value{};
double& ref;

void print()
{
std::cout << _name << ":\n";
std::cout << "\tvalue = " << value << " (" << &value << ")\n";
std::cout << "\t ref = " << ref << " (" << &ref << ")\n\n";
}

private:
std::string _name;
};

在这种情况下一切正常:

Var v0("v0", 0.0);
Var v1("v1", 1.0);
Var v2("v2", 2.0);

v0.print();
v1.print();
v2.print();

输出是:

v0:
value = 0 (000000DDE3D3F878)
ref = 0 (000000DDE3D3F878)
v1:
value = 1 (000000DDE3D3F8E8)
ref = 1 (000000DDE3D3F8E8)
v2:
value = 2 (000000DDE3D3F958)
ref = 2 (000000DDE3D3F958)

但是当对象被放置在一个 vector 中时,ref 变量对于所有对象都是相同的。

vector<Var> V{};
for (size_t i = 0; i < 3; i++)
{
std::string name = "V[" + std::to_string(i) + "]";
V.push_back(Var(name, i));
}

for (size_t i = 0; i < 3; i++)
V[i].print();

输出:

V[0]:
value = 0 (000002B594F55C70)
ref = 2 (000000DDE3D3FA88)
V[1]:
value = 1 (000002B594F55CA8)
ref = 2 (000000DDE3D3FA88)
V[2]:
value = 2 (000002B594F55CE0)
ref = 2 (000000DDE3D3FA88)

我做错了什么?

block 引用

最佳答案

std::vector 需要适当编写的赋值运算符。

编译器提供的那个对你的类是无用的,因为引用没有被反弹。所以你需要自己写出来。这不是微不足道的:

Assignment operator with reference members

不过,最好的办法是删除引用类成员。

关于c++ - 为什么对 vector 中类成员的引用指向不同对象的相同值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64233643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com