通过在getter方法上应用begin()获得的迭代器不允许访问指向列表的第一个元素
iterator got by applying begin() on getter method doesn't allow to access to first elements of pointed list
我有一个带有getter方法的对象指针*myObject
:
vector<string> getList();
当我创建迭代器来运行getList()返回的列表变量时,如下所示:
vector<string>::const_iterator it = myObject->getList().begin();
我显示它:
cout << *it << endl;
它什么也不显示(当然是一个空字符串)。它与it+1
、it+2
、it+3
、it+4
类似,但从it+5
开始,它显示右侧元素
然而,当我这样重写代码时:
vector<string> myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;
一切正常。
你能帮我理解这个问题吗?
谢谢。
执行此操作时:
vector<string>::const_iterator it = myObject->getList().begin();
在行的末尾,迭代器it
无效,因为getList()
返回的vector<string>
是一个临时值。
但是,当您使用将vector<string>
存储在本地变量中时
vector<string> myList = myObject.getList();
然后,只要myList
没有被破坏,迭代器就保持有效。
在第一种情况下,代码具有未定义的行为,因为函数myObject.getList()
返回的类型为std::vector<std::string>
的临时对象将在执行语句结束时被删除。因此迭代器将无效。
除了第二个例子中的有效代码外,您还可以编写
const vector<string> &myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;
也就是说,您可以使用对临时对象的常量引用。
问题是,您正在返回向量的副本,它将超出范围且不存在,因此无效。
您想要做的是返回一个对列表的const引用。
const vector<string>& getList();
相关文章:
- 如何确保 Visual C++ 不允许作用域枚举访问?
- 为什么 clang 不允许通过实例访问嵌套枚举类?
- 具有C 的Antlr4中的标签生成不允许访问标签值
- 仅允许访问对象的成员,而不允许访问对象本身
- 方法中不允许访问结构指针
- 不允许转换为无法访问的基类
- 函数从模板参数中获取字段值,而不是直接访问以允许对相同信息使用不同的名称
- 允许按派生类访问,但不允许重写
- C++ 共享库不允许静态数据成员访问
- 是否有技术原因不允许using声明以不同的名称访问函数名
- 从class_Type名称访问矢量值时不允许出现错误
- 重载模板类中的二进制运算符不允许访问私有数据成员
- 为什么标准不允许 std::for_each 对无效的随机访问迭代器范围有明确定义的行为?
- 不允许直接在同一类中访问成员变量
- 为什么不允许我们访问没有公共成员函数的类外私有静态成员?
- Maya c++ API不允许访问某些工具吗?
- xcode 5.1.1抱怨:ISO c++ 11不允许访问声明
- 访问c++类成员对象,但不允许覆盖它
- 允许C++类访问其他类的某些"internal"成员,但不允许访问私有类?
- C++ 为什么对象的副本不允许访问原始对象的私有变量?