[英]Qt QSharedDataPointer Multiple Inheritance diamond pattern?
我在應用程序的.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'的成員”。 這通常表明我需要添加公共QSharedData作為基類。 但是在這種情況下,Class2已從GroupElement派生,GroupElement以QSharedData作為基類。 如果我將QSharedData作為基類添加到Class 2中,則會收到警告消息“在'Class2'中無法訪問直接基址'QSharedData'會引起歧義。我認為可能遇到了具有多重繼承的'鑽石問題'之一,但是我我對Qt或c ++的經驗不足,無法解決。
幫助將不勝感激。
QSharedDataPointer
有一個非常特定的用例,在該用例中,您要在實例之間共享數據,並具有“寫時復制”行為-即,一旦一個實例嘗試對其進行修改,它就會分離並擁有自己的實例單獨的副本。 為了使此工作正常進行,包含在QSharedDataPointer
的對象必須繼承自QSharedData
,它提供了進行此工作所需的引用計數。
因此,您的困難與菱形圖案無關,您根本無法將QList
直接存儲在QSharedDataPointer
。 從您的示例中也不清楚這是您真正想要做的。 您實際上想通過設計實現什么? QSharedPointer
可能正是您真正想要的。
我建議您閱讀http://blog.qt.digia.com/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/了解有關Qt的說明智能指針類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.