0

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

如图所示编译代码时,编译器会报错“class ... has no member named 'ref'”。这通常表明我需要添加 public QSharedData 作为基类。但在这种情况下,Class2 已经派生自 GroupElement,它以 QSharedData 作为基类。如果我将 QSharedData 作为基类添加到 Class 2,我会收到警告消息“在 'Class2' 中无法访问直接基 'QSharedData' 会造成歧义。我认为可能遇到了多重继承的“钻石问题”之一,但我' m 在 Qt 或 c++ 方面经验不足,不知道如何解决它。

帮助将不胜感激。

4

1 回答 1

1

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

因此,您的困难与菱形图案无关,您根本无法将 aQList直接存储在 a 中QSharedDataPointer。从您的示例中也不清楚这是您真正想要做的。你实际上想用你的设计来实现什么?很可能 aQSharedPointer是你真正想要的。

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

于 2012-11-02T09:49:18.020 回答