3

呼び出し元から隠したいデータ メンバーを持つクラスがあります (型のヘッダーを含めるとコンパイル時間が大幅に長くなり、このクラスを使用するすべてのプロジェクトでインクルード パスにパスを追加する必要があるため) )。

このクラスはQSharedDataPointer、このデータを格納するために使用します。このようにして、デフォルトのコピー コンストラクターを使用してコピーできます。

このクラスの基本構造は次のとおりです。

class MyClass {
private:
  QSharedDataPointer<MySharedClassData> m_data;
};

同じヘッダーファイルで(から継承する)を定義せずにこれを行うための巧妙なトリックはありますか? または、データ フィールドを非表示にする他の良い方法はありますか?MySharedClassDataQSharedData

私はすでに の前方宣言を試みましたが、これはうまくいきませんでした (事実にもMySharedClassDataかかわらず)。m_dataprivate

私が現在できる唯一の解決策は、m_dataとして宣言するQSharedDataPointer<QSharedData>ことですが、アクセスするたびにデータメンバーをキャストする必要があります。より良い解決策はありますか?

4

3 に答える 3

6

コンストラクタとデストラクタがヘッダーで定義されていない限り、前方宣言は機能するはずです。次のクラスは私のコンピューターでコンパイルされます。

#ifndef MAIN_WINDOW_HXX
#define MAIN_WINDOW_HXX

#include <QMainWindow>
#include <ui_MainWindow.h>

#include <QSharedDataPointer>

class MySharedClassData;

class MainWindow : public QMainWindow, private Ui_MainWindow {
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
    virtual ~MainWindow();

    QSharedDataPointer<MySharedClassData> m_data;

};

#endif

C2027: use of undefined type 'type'コンストラクタ/デストラクタをインライン化しようとすると、 VSで:を受け取る可能性があります。

于 2012-02-07T12:35:48.947 に答える
0

はい。本当に派手なトリックは必要ありません。ただし、必要なすべてのメソッドは、 の定義の後に定義する必要があります。クラス定義を .cpp ファイルに移動する場合、メソッドもそこに移動する必要があります。MySharedClassDataMySharedClassData

于 2012-02-07T12:38:11.980 に答える
0

一般に、(impl オブジェクトを手動で管理するのではなく) 前方宣言された impl へのスマート ポインターを使用して pimpl イディオムを使用する場合は、次のように、行外の削除機能を備えたスマート ポインターが必要ですboost::shared_ptr(次のようにする必要があります)。カスタムデリータで使用できますstd::unique_ptrが、試していません)。

要件は、impl クラスのデストラクタを表示せずにスマート ポインタ テンプレートをインスタンス化できることですstd::auto_ptr。たとえば、これは除外されます。

要件を満たしているかどうかはわかりませんQSharedDataPointerが、tibur は満たしていると言っているようです。

于 2012-02-07T12:40:36.560 に答える