【问题标题】:const is the ailment that is killing my C++ programs. What happened this time? [duplicate]const 是杀死我的 C++ 程序的疾病。这次发生了什么? [复制]
【发布时间】:2014-11-21 16:18:38
【问题描述】:

我有一门课是这样的

class HtmlRover
{
public:
    HtmlRover(const std::string::const_iterator &, const std::string::const_iterator &);
    ~HtmlRover();
    // ...
private:
    /...
    std::string::const_iterator _curIter;
    const std::string::const_iterator _offend;
    /...
};

我的编译器抱怨我在构造函数的实现中实例化了_offend

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2)
{
    _curIter = it1;
    _offend = it2; 
}

上面写着

No vaiable overload "="

现在我知道这可能与将 const 变量设置为变量的引用有关,但又一次引用也是 const,那么有什么问题吗?我知道 const 变量不经过初始化就无法存在,但这也不应该成为问题,因为 _offend 正在初始化 HtmlRover 对象时被初始化。

【问题讨论】:

  • 我没有尝试修复语法问题,而是首先问自己为什么 Rover 对象需要缓存迭代器。 en.wikipedia.org/wiki/Code_smell
  • +1 用于问题标题,-1 用于基于误解和错误编码风格(不使用初始化列表)的问题。
  • 使用初始化列表,就像现在一样 _offend 正在使用赋值运算符,这显然是不行的,因为它是 const。
  • @rubenvb:我知道旧标题有一个很好的头韵,但它几乎不是 PC。但我不想和你发生编辑大战,所以如果你对原始表单有强烈的感觉,就把它改回来。
  • @rubenvb 诚实的问题:为什么-1 是基于听起来像程序员缺乏经验的问题?如果我们对没有经验的代码投反对票并拒绝问题,那么我们就有点违背了 SO 的部分目的。

标签: c++


【解决方案1】:

由于_offendconst,您需要使用基本成员初始化器 来设置其值:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2) :
   _offend(it2)
{
    _curIter = it1;     
}

最好以类似方式对待 _curIter,尽管语言不会坚持这样做。

【讨论】:

    【解决方案2】:

    你必须在初始化列表中初始化 const 成员:

    HtmlRover::HtmlRover(const std::string::const_iterator & it1, 
                         const std::string::const_iterator & it2)
    : _curIter(it1) // can be here
    , _offend(it2) // must be here
    {
    }
    

    【讨论】:

    • @Bathsheba 也是正确的,但我更喜欢这个答案,因为在可能的情况下使用初始化列表总是更好,即使对于其他成员而不是引用。
    • 是的,这个答案比我的更简洁,赞一个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多