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

时间:2012-02-17 12:37:25

标签: c++ const this

  

可能重复:
  c++ passing a const object reference to a function

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);

}  

我收到以下错误:

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

如果我使函数const然后它会抛出错误 m_output.clear()m_output.push_back(),这是显而易见的,但我需要清除缓冲区,以便在再次调用该函数时,不会附加以前的数据。

3 个答案:

答案 0 :(得分:5)

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

QByteArray &playbackBuffer

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


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

const_cast<QByteArray &>(playbackBuffer);

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

const_cast<QByteArray &>(playbackBuffer).append(ba);

答案 1 :(得分:4)

问题出在

playbackBuffer.append(ba);

你想改变playbackBuffer,所以不要把它作为const引用传递。

答案 2 :(得分:0)

const_cast返回了QByteArray&类型的对象(它从原始类型中删除了const)但是你没有对该对象做任何事情 - {{1没有改变 - 它仍然是playbackBuffer

你可以做两件事:

1)对强制转换运算符返回的const QByteArray&类型的临时未命名变量调用类方法:

QByteArray&

2)将强制转换操作符的返回值赋给类型为const_cast<QByteArray &>(playbackBuffer).append(ba); 的局部变量(如果要再次使用它来调用非常量成员函数):

QByteArray&

无论如何,你应该首先考虑为什么将一个对象作为const引用传递,然后尝试欺骗它并在转换 QByteArray& playbackBufferNonConstRef = const_cast<QByteArray&>(playbackBuffer); playbackBufferNonConstRef.append(ba); 之后更改它。如果将函数的参数声明为const引用,则客户端将认为传递给它的对象不会更改。但是通过这种设计,他们将获得意想不到的结果......