Qt QSharedDataPointer多重继承菱形图案?

时间:2012-11-02 03:17:45

标签: c++ qt multiple-inheritance

我在我的应用程序的.h文件中定义了2个类

class GroupElement : public QSharedData
{
public:
    int Id;
    int GroupIndex;
    QString Title;
    QSharedDataPointer<AccessDescriptor> pAccessDescriptor;
    QString Owner;
};

class Class2 : public GroupElement
{
public:
    QSharedDataPointer<QList<int> >  Categories;
    // ... many other class members
}

class3 : public QObject
{
  Q_OBJECT
public:
template <class T> QSharedDataPointer<QList<T> > toTQList(QVariant qv );
//...more ....
}

在另一个函数中,我尝试为“Categories”

指定一个值
QSharedDataPointer<Class2>
Class3::afunction(QVariantMap o)
{

    QSharedDataPointer<Class2> getResult(new Class2());

    getResult-> Categories = toTQList<int>(o["Categories"]);

    // ... more code ...
}

如图所示编译代码时,编译器会抱怨“class ...没有名为'ref'的成员”。这通常表明我需要添加公共QSharedData作为基类。但在这种情况下,Class2已经从GroupElement派生而来,它将QSharedData作为基类。如果我将QSharedData作为基类添加到类2中,我会收到警告消息“直接基础'QSharedData'在'Class2'中不可访问,这样做会产生歧义。我认为可能遇到了一个带有多重继承的'钻石问题'但是我'在Qt或c ++中没有足够的经验知道如何解决它。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

QSharedDataPointer有一个非常具体的用例,你希望在实例之间共享数据,具有写时复制行为 - 也就是说,只要一个实例尝试修改它,它就是分离,它现在有它自己的单独副本。为此,QSharedDataPointer中包含的对象必须从QSharedData继承,该QList提供了此操作所需的引用计数。

因此,您的难度与钻石图案无关,您根本无法将QSharedDataPointer直接存储在QSharedPointer中。从你的例子中可以清楚地知道这是你真正想做的事情。你实际上想用你的设计实现什么?很可能{{1}}就是你真正想要的。

我建议你阅读http://blog.qt.digia.com/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/来解释Qt的智能指针类。