5

Qtのドキュメントでは、下位の可視実装で QSharedDataPointer を使用することは一般的ではないことが示唆されています。

したがって、ドキュメントで切り取られた小さな例によると、次のソース (SSCCE) を思いつきました。

インターフェース: Model.h

インターフェイスは単純明快で、private クラスとハンドル クラスの前方宣言だけで、copy-ctor と d-tor が宣言されています。

#include <QtCore/QSharedDataPointer>

class ModelPrivate;
class Model {
    public:
        Model();
        Model(const Model &other);
        ~Model();

        QSharedDataPointer<ModelPrivate> d;
};

プライベート ヘッダー: Model_p.h

下位クラスを宣言して定義するだけです。

#include <QSharedData>
class ModelPrivate:
    public QSharedData {

    public:

};

実装: Model.cc

ドキュメントから取得した c-tors/d-tor の実装で構成されています。

#include "Model.h"
#include "Model_p.h"

class ModelPrivate:
    public QSharedData {

};

Model::Model():
    d(new ModelPrivate()) {

}

Model::Model(const Model &other):
    d(other.d) {

}

Model::~Model() {

}

ユースケース: main.cc

すべてが失敗した場所。

#include <QString>
#include "Model.h"

int main(int argc, char *argv[]) {
    QString s1, s2;
    s2 = s1;

    Model m1, m2;
    m2 = m1;
}

他の共有クラスと同様に、2 つのインスタンスと 1 つの割り当てだけです。しかし、それはひどく失敗します

invalid use of incomplete type 'class ModelPrivate'

ドキュメントによると、これを期待どおりに機能させる方法、つまりヘッダーでプライベートクラスを完全に宣言する方法がわかりません。そうするときに機能することは知っていますが、ドキュメントを理解したいと思います。共有クラスを割り当てる例もドキュメントに含まれています。上記のリンクのドキュメントから:

クラス EmployeeData はクラス Employee (employee.h) と同じファイルに含まれているため、ここではコピー コンストラクターは厳密には必要ありません。ただし、QSharedDataPointer を含むパブリック クラスと同じファイルに QSharedData のプライベート サブクラスを含めることは一般的ではありません。通常、QSharedData のプライベート サブクラスを、パブリック ファイルには含まれない別のファイルに配置することで、ユーザーから隠します。この場合、通常はクラス EmployeeData を別のファイルに配置しますが、これは employee.h には含まれません。代わりに、employee.h でプライベート サブクラス EmployeeData を次のように事前宣言します。

operator=を割り当てるときに使用されるでコンパイルが失敗すると思いますModel

4

2 に答える 2

0

問題は実際には、クラスdのテンプレートを介して宣言および定義されたメンバーの代入演算子にあります。QSharedDataPointer

解決策は、共有クラスの代入演算子をモジュールに移動するのと同じくらい簡単です。

新しいインターフェース: Model.h

#include <QtCore/QSharedDataPointer>

class ModelPrivate;
class Model {
    public:
        Model();
        Model(const Model &other);
        Model &operator =(const Model &other); /* <-- */
        ~Model();

        QSharedDataPointer<ModelPrivate> d;
};

プライベート ヘッダー: Model_p.h

#include <QSharedData>
class ModelPrivate:
    public QSharedData {

    public:

};

実装: Model.cc:

#include "Model.h"
#include "Model_p.h"

Model::Model():
    d(new ModelPrivate()) {

}

Model::Model(const Model &other):
    d(other.d) {

}

Model::~Model() {

}

Model &Model::operator =(const Model &other) {
    d = other.d;
    return *this;
}

ユースケース: main.cc

#include <QString>
#include "Model.h"

int main() {
    QString s1, s2;
    s2 = s1;

    Model m1, m2;
    m2 = m1;
}

プロジェクトファイル: example.pro

TEMPLATE = app
TARGET = example
QT = core
HEADERS += Model.h Model_p.h
SOURCES += Model.cc main.cc

実際、これは Qt ユニバース自体の他のクラスがどのように実装されているかです。たとえば、 を考えてみましょうQTextCursor

于 2014-12-27T13:47:18.183 に答える