将'const'作为'this'参数传递给

ken*_*ken 0 c++ const this

可能重复:
c ++将const对象引用传递给函数

void SpectrumAnalyserThread::calculateFFT(AnalogData &frame, const QByteArray       &playbackBuffer)   
{

   fft->window(frame.data(),frame.size());

    fft->fix_fftr(frame.data(), qFloor(log(frame.size()) / log(2)), 0);

     for(int i = 0; i < m_numSamples; ++i)
     {
        m_output.push_back(frame[i]);
     }
     fft->fix_fftr(m_output.data(), qFloor(log(m_output.size()) / log(2)), 0);

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

    const_cast<QByteArray &>(playbackBuffer);

    playbackBuffer.append(ba);

    m_output.clear();

    calculateMagnitude(frame);

}  
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: passing 'const QByteArray' as 'this' argument of 'QByteArray& QByteArray::append(const QByteArray&)' discards qualifiers [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

如果我做了功能常量则在抛出错误 m_output.clear(),m_output.push_back(),这是显而易见的,但我需要清除缓冲区,这样当函数被再次调用以前的数据不会被追加.

CB *_*ley 5

如果要修改playbackBuffer,则应将参数作为非const参数:

QByteArray &playbackBuffer
Run Code Online (Sandbox Code Playgroud)

这完全独立于是否SpectrumAnalyserThread声明了成员函数const(如果它修改了this'内部状态则不应该这样).


请注意,此行无效.要使用演员表的结果,你必须对它做点什么.单独使用强制转换的语句只执行转换,然后抛弃转换的结果.

const_cast<QByteArray &>(playbackBuffer);
Run Code Online (Sandbox Code Playgroud)

您可以执行类似下面的操作,但它会冒未定义的行为,并且滥用您与函数调用者签订的合同,您可以通过const参考来说明您不会修改playbackBuffer.

const_cast<QByteArray &>(playbackBuffer).append(ba);
Run Code Online (Sandbox Code Playgroud)