我想有一个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);
^
我该怎么办?
答案 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;
}