gpt4 book ai didi

c++ - C++ 中的 vector 元素总是设置为最后一个元素

转载 作者:行者123 更新时间:2023-11-30 00:49:00 25 4
gpt4 key购买 nike

我想将一个类的成员存储到一个 vector 中。在我的类(class)中,我有一些私有(private)变量,我通过常量指针访问这些变量,以防止它们被更改 ( see this post )。问题:当我在循环期间将类的实例添加到 vector 中并随后访问它们时,所有元素似乎都是最后添加的元素。这是一个 MWE:

#include <iostream>
#include <vector>

using namespace std;

class myClass {
private:
int x_;

void init(int x) {
x_ = x;
}

public:
const int &x;

myClass(int x) : x(x_) {
init(x);
};
};

int main(int argc, const char * argv[]) {
vector<myClass> myVector;

// Does not work
for (int j=0; j<3; j++) {
myVector.push_back(myClass(j));
}
for (int j=0; j<3; j++) {
cout << "1st attempt: " << myVector.at(j).x << endl;
}
myVector.clear();

// Works
for (int j=0; j<3; j++) {
myVector.push_back(myClass(j));
cout << "2nd attempt: " << myVector.at(j).x << endl;
}
myVector.clear();

// Works also
myVector.push_back(myClass(0));
myVector.push_back(myClass(1));
myVector.push_back(myClass(2));
for (int j=0; j<3; j++) {
cout << "3rd attempt: " << myVector.at(j).x << endl;
}

return 0;
}

明显的问题:我做错了什么,我能改正吗?

最佳答案

What am I doing wrong and can I fix it?

这个想法总的来说看起来是错误的。撇开这个不谈:如果你想“修复它”,你需要考虑当你 push_back 时发生了什么:

for (int j=0; j<3; j++) {
myVector.push_back(myClass(j));
}

您正在按值传递类,因此调用了复制构造函数。因此 push_back 没有得到 myClass(j),它得到了一个拷贝。但是您没有编写复制构造函数……那么您的复制构造函数来自哪里?您将获得编译器默认值,它只是说拷贝的 int &x 获得与原始 相同的值(与新对象的 x_ 相反。)

这意味着 vector 中拷贝内的引用是您作为 myClass(j) 传入的原始对象。然而,原始参数在 push_back 调用完成后被释放。每次循环都可能重复使用内存空间,这就是您看到最后一个陈旧值的原因。尝试通过 Valgrind 运行它或类似的,它可能会发现一个问题。

你可以通过编写你自己的复制构造函数来解决这个问题,它会按照你的实际意思去做:

class myClass {
private:
int x_;

void init(int x) {
x_ = x;
}

public:
const int &x;

myClass(int x) : x(x_) {
init(x);
};

myClass(myClass const & other) : x_ (other.x_), x(x_) {
}
};

通过这种方式,您可以明确地告诉编译器您隐式希望将 int const & 链接到 int。如果您不告诉它,它根本无法知道它们之间的关系。

但是一开始可能有很多理由不做这种界面。除非您有充分的理由不这样做,否则只需使用普通的访问器方法即可。

(另请注意@JoachimPileborg 对 emplace_back 的建议,了解这一点很好。)

关于c++ - C++ 中的 vector 元素总是设置为最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072393/

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