簡體   English   中英

Qt QSharedDataPointer多重繼承菱形圖案?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM