【问题标题】:c++ passing a const object reference to a functionc++ 将 const 对象引用传递给函数
【发布时间】:2012-02-17 11:29:25
【问题描述】:

错误:将 'const QByteArray' 作为 'QByteArray& QByteArray::append(const QByteArray&)' 的 'this' 参数传递会丢弃限定符 [-fpermissive]

因为在作为函数参数传递时使对象为 const 是一种惯例,所以我已经做到了。 但现在我得到一个错误!, 我不想让函数保持不变,因为我必须将 qbyte 数组中的数据转换为短格式,然后将其附加到另一个数组中。

QByteArray ba((const char*)m_output.data(), sizeof(ushort));
    playbackBuffer.append(ba);

我真的需要把这个数组传递给playbackbuffer
playbackBuffer.append(ba) 上给我一个错误;

请帮忙
提前致谢

【问题讨论】:

  • 您至少必须发布一些代码才能理解错误,您不这么认为吗?
  • 约定应该是通过 const 引用传递对象如果它们不打算更改。如果传递的 QByteArray 不应更改,那么您可以将其复制到本地 QByteArray 并处理那个。
  • “因为在作为函数参数传递时将对象设为 const 是一种惯例” - 仅当函数不应该修改它时。如果它确实修改了它,那么声明它const 充其量是误导。
  • 抱歉,这将发布代码。

标签: c++ reference constants


【解决方案1】:

这意味着您正在对 const 成员调用非 const 成员函数。据推测,您的 append 函数修改了字节数组。使用 const 引用,您不应该进行修改。

【讨论】:

  • 我没有修改数组中的数据,我只是读取它并将其附加到另一个数组中,没有办法解决。
  • 从您编辑的问题中:它可能不是 const 的播放缓冲区。如果需要填写,请勿将其作为 const 引用传递。
【解决方案2】:

基本上它说的是你试图追加到一个常量数组。

如果“追加”不改变对象本身而只是返回附加的两个数组,the method needs to be declared const to allow the call.

【讨论】:

    【解决方案3】:

    考虑一下:

    struct foo
    {
        void bar();
    };
    
    const foo f;
    f.bar();
    

    这里,在对bar() 的调用中,this 指针是&f。但是bar()不是const-function,所以this的类型是foo*,与const foo*不兼容。 (换句话说,bar() 表示它可能会改变 foo,但 f 表示它是不可改变的foo。)

    bar() 需要标记为const(如果可以),或者f 不需要标记为const

    在您的情况下,我将假设您正在使用 Qt,因此无法修改 QByteArray(您也不应该修改,因为 append 必然是一个非常量函数),而是建议您摆脱对象上的const,这会阻止您使用该功能。

    【讨论】:

      【解决方案4】:

      所以你想在一个 const 对象上调用一个非 const 函数? 这就是将 const xxx 作为 'this' 参数传递的含义。 因为最终任何成员函数确实是 (类 * this,其余参数)

      【讨论】:

        【解决方案5】:

        要么做你的

        QByteArray& QByteArray::append(const QByteArray&);
        

        成为

        QByteArray& QByteArray::append(const QByteArray&) const;
        

        (极不可能解决任何问题)或只是

            QByteArray* pObj = const_cast<QByteArray*>(&your_obj)
            if (pObj)
                pObj->append(...
        

        【讨论】:

        • 危险地接近 -1'ing,但你为什么要在这里建议 const_cast?你想要未定义的行为吗?
        • 确实,const_cast 是完全错误的,如果对象是const,则会给出未定义的行为。如果你需要能够修改它,那么首先不要声明它const
        • 不,这更糟:只有 dynamic_cast 不能转换时返回空指针。
        • 取决于编译器。他们并不都遵循标准
        猜你喜欢
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2016-04-15
        • 2016-02-15
        相关资源
        最近更新 更多