3

Qt でプライベート実装 (暗黙の共有) を非表示にするにはどうすればよいですか?

Employee.h ヘッダーに次の Employee.cpp があります。

#include <QSharedData>
#include <QString>


class EmployeeData;
class Employee: public QObject
{
    Q_OBJECT
    public:
    Employee();
    Employee(int id, QString name);
    Employee(const Employee &other);
    void setId(int id);
    void setName(QString name);

    int id();
    QString name();

private:
    QSharedDataPointer<EmployeeData> d;
};

class EmployeeData : public QSharedData
{
  public:
    EmployeeData() : id(-1) { name.clear(); }
    EmployeeData(const EmployeeData &other)
        : QSharedData(other), id(other.id), name(other.name) { }
    ~EmployeeData() { }

    int id;
    QString name;
};

しかし、EmployeeData をプライベート パーツ、たとえば Employee.cpp に移動すると、次のエラーが表示されます: エラー: 不完全な型 'struct EmployeeData' の無効な使用</p>

ただし、定義を次のように変更すると、正常に動作します。

class Employee
{
public:
    Employee();
    Employee(int id, QString name);
 ..

したがって、 QObject から継承しながら QSharedData を使用できますか?

4

1 に答える 1

2

したがって、QObjectから継承しながらQSharedDataを使用できますか?

QSharedDataを使用する場合、QObjectから継承することはできません。QSharedDataは、コピーオンライトセマンティクスを使用し、データが共有されなくなったときにdetach()を呼び出してデータのコピーを作成します。コピーを行うには、QObjectがサポートしていないコピーコンストラクターが必要です。

pimpl (またはハンドルボディ/不透明ポインターイディオム)は、多くの場合、データクラスにパブリック実装への参照を提供します。これは、シグナルとスロットを操作する方法です。

QSharedDataPointerは、実装の詳細のほとんどを提供しますが、Qtで使用されているpimplイディオムを確認することも非常に有益です(Q_Dとその仲間を参照) 。

于 2010-04-08T19:56:11.017 に答える