【问题标题】:Qt QSharedDataPointer Multiple Inheritance diamond pattern?Qt QSharedDataPointer 多重继承菱形模式?
【发布时间】:2012-11-02 03:17:45
【问题描述】:

我在应用程序的 .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 已经派生自 GroupElement,它以 QSharedData 作为基类。如果我将 QSharedData 作为基类添加到 Class 2,我会收到警告消息“在 'Class2' 中无法访问直接基 'QSharedData' 会造成歧义。我认为可能遇到了多重继承的“钻石问题”之一,但我'我没有足够的 Qt 或 c++ 经验知道如何解决它。

我们将不胜感激。

【问题讨论】:

    标签: c++ qt multiple-inheritance


    【解决方案1】:

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

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

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

    【讨论】:

    • 我之所以使用 QSharedDataPointer 是因为我阅读了您引用的文章。我不想使用简单的指针来避免内存泄漏。我想我误解了这篇文章,并认为如果我想确保不删除底层数据,则需要 QSharedDataPointer。我想只要我只通过 QSharedPointer 访问数据就可以了。
    猜你喜欢
    • 2023-03-09
    • 2016-06-08
    • 2014-06-28
    • 2012-10-16
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多