gpt4 book ai didi

c++ - 通过 getter 访问列表元素与直接访问类成员给出了不同的答案

转载 作者:行者123 更新时间:2023-11-27 23:11:38 24 4
gpt4 key购买 nike

当我遇到以下我不理解的行为时,我正在摆弄各种处理数据的方法。在阅读下面的代码时,请注意变量 firstDoubleItersecondDoubleIter,特别是它们指向列表(各种拷贝)的哪些元素。

我的问题在下面。

#include <list>                                                                      
#include <iostream>

template <class T>
class MyListContainer
{
public:
std::list<T> list;
MyListContainer() : list() {;}
MyListContainer(const MyListContainer& container) : list(container.list) {;}
MyListContainer(std::list<T> list) : list(list) {;}
std::list<T> getList() const {return list;}
};

int main()
{
typedef MyListContainer<double> DoubleList;
DoubleList doubleContainer = DoubleList(std::list<double>({0, 1}));
auto firstDoubleIter = doubleContainer.getList().begin();
auto secondDoubleIter = ++(doubleContainer.getList().begin());
std::cout << "Using the getList() method\n";
std::cout << "*firstDoubleIter = " << *firstDoubleIter << "\n";
std::cout << "*secondDoubleIter = " << *secondDoubleIter << "\n";

std::list<double> listOfDoubles = doubleContainer.list;
firstDoubleIter = listOfDoubles.begin();
secondDoubleIter = ++listOfDoubles.begin();
std::cout << "Accessing the list directly\n";
std::cout << "*firstDoubleIter = " << *firstDoubleIter << "\n";
std::cout << "*secondDoubleIter = " << *secondDoubleIter << "\n";
}

产生以下输出:

Using the getList() method
*firstDoubleIter = 1
*secondDoubleIter = 0
Accessing the list directly
*firstDoubleIter = 0
*secondDoubleIter = 1

我的理解是,即使使用隐式列表拷贝,*firstDoubleIter*secondDoubleIter 的值也应该相同。

我的问题是:为什么它们不一样?

最佳答案

在第一种情况下,每次调用 getList 都会返回列表的临时拷贝,并在语句结束时销毁。由于迭代器不再引用有效的列表元素,因此在取消引用它们时会出现未定义的行为。

在第二种情况下,您存储列表的本地拷贝,因此迭代器仍然有效。

根据您打算如何使用此类,您可能希望 getList 返回一个引用而不是一个拷贝。

关于c++ - 通过 getter 访问列表元素与直接访问类成员给出了不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19924271/

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