【问题标题】:How to get a non-const iterator while using a const "this" pointer?如何在使用 const “this” 指针时获取非常量迭代器?
【发布时间】:2012-03-29 07:33:05
【问题描述】:

我的问题是使用 const_cast。我有一个从向量继承的类。现在在它的一个成员函数中,当我使用this->begin()this 作为 const 指针时,它返回一个常量迭代器,但我想获得一个非常量迭代器。代码看起来像...

class xyz : private std::vector<//something>
{
public:
 xyz();
 void doSomething();
}

void doSomething()
{
    xyz::iterator it;
    it = this->begin();
    *it.insert(something); //here is the problem and this where I need to use const_cast 
                           // and in a lot more places
}

在上面的函数中,由于this-&gt;begin()返回一个常量迭代器,我不得不使用一个常量迭代器并在需要插入元素时进行类型转换。

我曾想过在 this->begin() 处使用 const_cast,但我的朋友告诉我,删除 this 指针的 const 是个坏主意。如果是这样,那还有什么办法呢?

【问题讨论】:

  • 其实你用我有一个继承自vector的类开了一罐虫子,为什么你继承自std::vector?它不适用于继承。
  • @Als :我需要一个从向量继承的类,以便类本身充当向量,您能否更具体地说明为什么继承我不是一个好主意,所以请帮忙我。
  • @Als :好吧,我一定会那样使用它,但是我面临的 const_cast 问题有解决方案吗?
  • @Als:您链接的答案包含极具争议的个人信念,没有说服力。实际上,并非每个类都需要虚拟析构函数,并且对于每个功能,人们都尽量避免在该功能有用时存在特定情况。同样适用于从容器继承。
  • @SigTerm:“只要不使用指向向量的指针删除派生类,就不会引起问题”。你怎么知道你的程序员同事或你的 API 用户不会这样做?我的观点是最好避免任何对象切片的机会。

标签: c++ casting constants this


【解决方案1】:

如果向量是类状态的一部分,无论是作为成员还是 作为基础(尽管公开继承自 vector),则 const 成员函数不应修改它。如果 向量是状态的一部分,一个函数修改它,函数 不应该是 const。

一般。在某些特殊情况下,例如,向量 表示缓存状态,即经过逻辑计算,但其 计算成本高。在这种情况下,您可以使向量 可变成员。但请确保向量真的不代表 “可观察状态”。

最后,您发布的代码似乎与您没有任何关系 问题。对于初学者来说,唯一的功能是非常量。和 代码无法编译,有几个原因(在非成员中使用 this 函数,在迭代器上调用成员函数insert,它 没有这样的成员等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2023-03-12
    • 2012-01-28
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多