- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下代码:
#include <vector>
using namespace std;
struct foo
{
void bar()
{
}
};
int main()
{
{
vector<foo*> a;
a.push_back(new foo());
a.push_back(new foo());
a.push_back(new foo());
vector<foo*>::const_iterator itr = a.begin();
(*itr)->bar(); // compiles - this becomes more confusing
// when found in a const method. On first
// glance, one will (or at least me) may
// assume that bar() must be const if the
// method where it is being called from is
// const
// The above compiles because internally, this is what happens
// (ignore the fact that the pointer has not been newd)
foo* const * element;
(*element)->bar(); // compiles
// What I would expect however (maybe it is just me) is for const_iterator
// to behave something like this
const foo* const_element;
const_element->bar(); // compile error
}
{
vector<foo> a;
a.resize(10);
vector<foo>::const_iterator itr = a.begin();
itr->bar(); // compile error
}
}
我理解为什么它可以被调用。 const_iterator
像这样存储 const-ness:const T*
指针转换为 foo* const *
对象 foo const *
。
所以我的问题是,为什么我们可以从 const_iterator
调用非常量成员函数?不允许从 const_iterator
调用非常量成员函数不是更直观吗?带有 const 选项的 iterator
的设计不应该阻止这种行为吗?
现在更重要的问题是:如果我希望 const_iterator
禁止调用指向对象的非常量成员函数怎么办?
最佳答案
Shouldn't the design of iterators with the const option prevent this behaviour?
确实如此。您只是希望它是一个不同的操作。
如您所见,指针容器...包含指针,而不是对象。因此,指向此类指针的 const_iterator
意味着指针是常量,而不是它们指向的对象。
这不会改变,也不应该改变。标准库容器通常设计为包含完整的对象,而不是指针。所以他们不应该鼓励用户制作指针的 vector
和其他可疑的结构。
如果您确实需要一个vector
来包含指针,那么您应该使用一个真正设计 的容器。喜欢Boost's pointer container classes .它们的 const_iterators
使对象正确地指向 const
。它们还做其他有用的事情,比如拥有它们指向的对象(以便它们被正确删除)等等。
关于c++ - 如果容器元素是指针,为什么允许我从 const_iterator 调用非 const 成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965199/
#include #include using namespace std; void print(vector::const_iterator &beg, vector::const_itera
为什么在 STL 中 std::iterator_traits::value_type 与类型相同 std::iterator_traits::value_type 为什么要这样设计?第一个不应该是c
我正在阅读有关此功能工作方式的不同解释。 cplusplus.com说这个函数应该“直接在 i 之后移动元素”。 然而cppreference.com表示它拼接元素 AT i。 MSvisual st
我正在寻找一种将 std::set::const_iterator 用作我自己的类的 const_iterator 的方法。 我的代码(实际上行为正确并且编译良好)如下: class MyClass{
当我编译以下 MWE 时出现上述错误在 GCC 上 #include void frobnigate( const std::string& str ) { std::string::con
一般背景: 我正在尝试构建一个容器,该容器将作为运行时定义维度的多维数组的包装器 - 事实上,底层数组当然是总大小的一维数组。主要部分是 operator [] 返回子数组上的包装器。 由于容器需要迭
我在尝试使用 const_iterators 时收到运行时错误。错误是:列表迭代器不可取消引用。我知道不能取消引用 const_iterator 以将值分配到列表中,但我试图取消引用迭代器以访问列表中
我有一个方法可以找到 map 中的特定位置并通过迭代器引用“返回”它: bool Func(const int searchKey, MyMap::iterator& iter) const {
我正在用自定义容器扩展STL容器,以便对元素的操作提供更灵活的控制 class MyContainer; template class myiterator :public iterator {
这段代码 std::ostream& operator indent(output.rdbuf()); output.rdbuf(&indent); for (Arra
有件事我实在想不明白。以下情况: 测试.h文件: class Test{ public: const std::list& getItems() { return m_item
我正在从这本名为 Accelerated C++ 的书中学习 C++。一章有这个函数“split”,它接受从“getline”读取的字符串并返回一个充满分离词的 vector 。 vector spl
好的,这是我的问题。有人告诉我,我的类(class)没有匹配的构造函数。这是调用它的代码。 (忽略输入。我输入的内容似乎无关紧要,结果都很糟糕)。 const_iterator end() const
我正在用 C++ 做一个大学项目,其目的是学习如何使用不同的 STL 容器及其迭代器。 在我的程序中,我有一个带有集合的类: class ConjuntoDeLetras{ private:
我正在尝试用 C++ 实现我自己的双向链表 (my_list) 代码,尤其是我的列表的迭代器类。我的问题是我想要从迭代器到 const_iterator 的隐式转换,例如代码 my_list::ite
我的程序结构类似于: class A { private: std::set members; public: void func(const C& a
我有这个声明: list::const_iterator iter; 我正在尝试了解 *iter 的类型是:string* 、const string* 还是其他类型。 我读到 cost_iterat
我正在尝试为我的基于数组的列表类构建一个自定义的 const_iterator 嵌套类。这是类(class) class const_iterator { private: const T *p
我正在大学学习 OOP 类(class)(C++ 是基础语言)。我的任务是实现自己的链表模板容器类。我几乎完全做到了,但遇到了问题。已知STL提供iterator和 const_iterator通过列
我试图理解 const_iterator 的含义。我有以下示例代码: void CustomerService::RefreshCustomers() { for(std::vector::c
我是一名优秀的程序员,十分优秀!