2012-11-02 57 views
0

我在我的应用程序Qt QSharedDataPointer多继承菱形模式?

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 .... 
} 

的.h文件中定义在另一个函数2班我尝试将值分配给“分类”

QSharedDataPointer<Class2> 
Class3::afunction(QVariantMap o) 
{ 

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

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

    // ... more code ... 
} 

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

帮助将不胜感激。

回答

1

QSharedDataPointer有非常具体的用例,这是您要共享实例间的数据,与写入时复制行为 - 也就是说,只要有一个实例试图修改它,它就会分离并且它现在拥有它自己的单独副本。为此,QSharedDataPointer中包含的对象必须从QSharedData继承,该对象提供为此需要引用计数。

所以你的难度与钻石图案无关,你根本无法将QList直接存储在QSharedDataPointer中。从你的例子来看,这也是你真正想做的事。你实际上试图用你的设计实现什么?这可能是你真正想要的QSharedPointer

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

+0

我使用QSharedDataPointer的原因是因为我阅读了您引用的文章。我不想使用简单的指针来避免内存泄漏。我想我误解了这篇文章,并认为如果我想确保底层数据没有被删除,那么QSharedDataPointer是必需的。我猜只要我只通过QSharedPointer访问数据,我应该没问题。 – DarwinIcesurfer