我在我的应用程序的.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 ++中没有足够的经验知道如何解决它。
非常感谢帮助。
答案 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的智能指针类。