0

アプリの.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は、基本クラスとしてQSharedDataを持つGroupElementからすでに派生しています。QSharedDataを基本クラスとしてクラス2に追加すると、「クラス2ではアクセスできない直接ベースのQSharedData」という警告メッセージが表示されます。あいまいさを伴います。多重継承を伴う「菱形継承問題」の1つに遭遇した可能性がありますが、私はmQtまたはc++で、それを解決する方法を知るのに十分な経験がありません。

助けていただければ幸いです。

4

1 に答える 1

1

QSharedDataPointer非常に特殊なユースケースがあります。これは、コピーオンライト動作でインスタンス間でデータを共有する場合です。つまり、1つのインスタンスが変更を試みるとすぐに、デタッチされ、独自の個別のユースケースになります。コピー。これが機能するためには、mustに含まれるオブジェクトがQSharedDataPointerから継承する必要がQSharedDataあります。これは、これが機能するために必要な参照カウントを提供します。

したがって、あなたの難しさはダイヤモンドパターンとは何の関係もありません。単ににQList直接保存することはできませんQSharedDataPointer。また、これが本当にやりたいことであるということも、あなたの例からはまったく明らかではありません。デザインで実際に何を達成しようとしていますか?QSharedPointerそれはあなたが本当に欲しいものであるかもしれません。

Qtのスマートの説明については、https://www.qt.io/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-haveを読むことをお勧めしますポインタクラス。

于 2012-11-02T09:49:18.020 に答える