C++ 在getter方法上应用begin()得到的迭代器不';不允许访问指向列表的第一个元素
我有一个带有getter方法的对象指针C++ 在getter方法上应用begin()得到的迭代器不';不允许访问指向列表的第一个元素,c++,pointers,object,iterator,C++,Pointers,Object,Iterator,我有一个带有getter方法的对象指针*myObject: vector<string> getList(); 一切正常 你能帮我理解这个问题吗 谢谢。当您执行此操作时: vector<string>::const_iterator it = myObject->getList().begin(); 然后,只要未销毁myList,迭代器将保持有效。执行此操作时: vector<string>::const_iterator it = myObject
*myObject
:
vector<string> getList();
一切正常
你能帮我理解这个问题吗
谢谢。当您执行此操作时:
vector<string>::const_iterator it = myObject->getList().begin();
然后,只要未销毁myList,迭代器将保持有效。执行此操作时:
vector<string>::const_iterator it = myObject->getList().begin();
然后,迭代器保持有效,只要未销毁
myList
。在第一种情况下,代码具有未定义的行为,因为函数myObject.getList()
返回的std::vector
类型的临时对象将在执行语句的最后被删除。因此迭代器将无效
除了第二个示例中的有效代码之外,您还可以编写
const vector<string> &myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;
const vector&myList=myObject.getList();
vector::const_迭代器it=myList.begin();
cout在第一种情况下,代码具有未定义的行为,因为函数myObject.getList()
返回的类型为std::vector
的临时对象将在执行语句的最后被删除。因此迭代器将无效
除了第二个示例中的有效代码之外,您还可以编写
const vector<string> &myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;
const vector&myList=myObject.getList();
vector::const_迭代器it=myList.begin();
cout问题是您返回的是vector的副本,它将超出范围并不存在,因此无效
您要做的是返回对列表的常量引用
const vector<string>& getList();
const vector&getList();
问题在于,如果返回的是vector的副本,它将超出范围和存在范围,因此无效
您要做的是返回对列表的常量引用
const vector<string>& getList();
const vector&getList();
向量getList()在第一个示例中,当您取消引用该迭代器时,code>返回一个临时的、早就消失了的值。第二个复制该列表,然后迭代该列表。如果列表在您的对象中,并且您不想让人们弄脏它,那么让他们来决定是否复制它,并且只返回常量引用而不是副本。如果它是在getList()
成员中按需生成的,那么除了执行第二个代码片段,您别无选择在第一个示例中,当您取消引用该迭代器时,code>返回一个临时的、早就消失了的值。第二个复制该列表,然后迭代该列表。如果列表在您的对象中,并且您不想让人们弄脏它,那么让他们来决定是否复制它,并且只返回常量引用而不是副本。如果它是在getList()
成员中按需生成的,那么除了执行第二个代码片段,您别无选择。
const vector<string>& getList();