qt qsharedDatapointer多重继承钻石图案

Qt QSharedDataPointer Multiple Inheritance diamond pattern?

本文关键字:钻石 多重继承 qsharedDatapointer qt      更新时间:2023-10-16

我在我的应用程序的.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 ....
}

在另一个功能中,我尝试将值分配给"类别"

QSharedDataPointer<Class2>
Class3::afunction(QVariantMap o)
{
    QSharedDataPointer<Class2> getResult(new Class2());
    getResult-> Categories = toTQList<int>(o["Categories"]);
    // ... more code ...
}

编译代码如图所示时,编译器抱怨"类...没有成员命名为'ref'"。这通常表明我需要添加public qshareddata作为基类。但是在这种情况下,Class2已经源自将qsharedData作为基类的GroupElement。如果我将QsharedData添加到2类中,我会在" Class2"中获得警告消息"直接基本'qshareddata'无法访问。m在QT或C 方面的经验不足,无法知道如何解决。

帮助您将不胜感激。

QSharedDataPointer具有非常特定的用例修改它,它分离,现在具有自己的独立副本。为此,QSharedDataPointer中包含的对象必须从QSharedData继承,该对象提供了工作所需的参考计数。

因此,您的困难与钻石图案无关,您只是无法将QList直接存储在QSharedDataPointer中。从您的示例中也不清楚这是您真正想做的。您实际上想实现什么设计?很可能是QSharedPointer是您真正想要的。

我建议您阅读https://www.qt.io/blog/2009/08/25/count-with-me-how-many-smart-smart-pointer-classes-classes-does-does-qt-have-QT的智能指针类。