我的应用程序的.h文件中定义了两个类
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'“。这通常表示我需要添加公共QSharedData作为基类。但在本例中,Class2已经从GroupElement派生而来,后者以QSharedData作为基类。如果我将QSharedData作为基类添加到类2中,我会收到警告消息"direct base 'QSharedData‘inaccessible in 'Class2’do to ambiguity.我认为可能遇到了多重继承的‘菱形问题’之一,但我在Qt或c++方面没有足够的经验来知道如何解决它.
我们将非常感谢您的帮助。
发布于 2012-11-02 17:49:18
QSharedDataPointer有一个非常具体的用例,即您希望通过写入时复制行为在实例之间共享数据-即,只要一个实例试图修改它,它就会分离,现在它有了自己的独立副本。要实现这一点,QSharedDataPointer中包含的对象必须继承自QSharedData,它提供了实现这一点所需的引用计数。
所以您的困难与菱形模式无关,您只是不能直接在QSharedDataPointer中存储QList。从你的例子中也看不出这是你真正想要做的。你的设计到底想要达到什么目的?很可能QSharedPointer才是您真正想要的。
我建议您阅读https://www.qt.io/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have,了解有关Qt智能指针类的说明。
https://stackoverflow.com/questions/13188814
复制相似问题