将静态const对象强制转换为基类

时间:2016-02-08 11:56:33

标签: c++ qt

我想有一个static const对象,其中一些属性设置为某个变量。为此,我想到派生类并在派生类中设置属性。现在我必须与其他类共享const对象,但为了做到这一点,我应首先cast它到基类但我得到一个错误。

class QAudiolib
{
private:
    class DefaultAudioFormat : QAudioFormat
    {
        DefaultAudioFormat()
        {
            setByteOrder(QAudioFormat::LittleEndian);
            setChannelCount(2);
            setCodec("audio/pcm");
            setSampleRate(44100);
            setSampleSize(16);
            setSampleType(QAudioFormat::SignedInt);
        }
    };

    static const DefaultAudioFormat DEFAULT_FORMAT;

public:
    QAudiolib();

    static QAudioFormat getDefaultFormat()
    {
        return reinterpret_cast<QAudioFormat>(DEFAULT_FORMAT);
    }   

};

编译器在cast

上收到此错误
error: 'QAudioFormat' is an inaccessible base of 'QAudiolib::DefaultAudioFormat'
         return (QAudioFormat)(DEFAULT_FORMAT);
                                             ^

我该怎么办?

2 个答案:

答案 0 :(得分:2)

改为写class DefaultAudioFormat : public QAudioFormat

这使继承成为公共的,因此可以访问。

我不喜欢使用reinerpret_cast:为什么不简单地返回DEFAULT_FORMAT并将其余部分留给编译器?

答案 1 :(得分:1)

编译器错误是因为默认继承是私有的(对于类和对于结构的公共),所以你通过使用

来摆脱它
class DefaultAudioFormat : public QAudioFormat

除此之外,你还应该通过const引用返回,因为现在你做了一个副本(你创建一个新的QAudioFormat对象而不是传递原始的DefaultAudioFormat对象),这导致切片(尽管如果每个属性实际上都是QAudioFormat的一部分)那么这不是一个大问题,但仍然是。)

如果一切设置正确,您不需要在此进行任何类型转换。像这样:

static const QAudioFormat & getDefaultFormat()
{
    return DEFAULT_FORMAT;
}