2012-02-07 5 views
3

私は呼び出し元から非表示にしたいデータメンバを持つクラスを持っています(その型のヘッダーを含めるとコンパイル時間が大幅に増え、このクラスを使用するすべてのプロジェクトでインクルードパスに追加のパスを追加します)。プライベート(非表示)QSharedData

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

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

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

は、同じヘッダファイルに(QSharedDataから継承)MySharedClassDataを定義せずにこのを行うにはどんな派手なトリックはありますか?または、データフィールドを隠す他の良い方法がありますか?

私は既にMySharedClassDataの順方向宣言を試みましたが、これはうまくいかなかった(m_dataprivateであるにもかかわらず)。

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

+1

この場合、[Pimpl](http://en.wikipedia.org/wiki/Opaque_pointer)イディオムは私が考えることができるものですか? – maverik

+0

@maverik:はい。 "' QSharedDataPointer'クラスは、 '暗黙のうちに共有されるオブジェクトへの' pinterinterfaceを表します。 " – MSalters

+0

はい、これはまさに私がやろうとしていることです。残念ながら、これは 'QSharedDataPointer'では動作しません。少なくとも、私はこのことをどうやって解決するのか分からない。 –

答えて

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 

あなたは、コンストラクタ/デストラクタをインライン化しようとすると、あなたが受け取ることがあります:VS.下C2027: use of undefined type 'type'

+0

これは正しいヒントです。しかし私の場合は、コピーコンストラクタと代入演算子を手動で実装する必要もありました。 –

+0

私はoperator =()がMSVCや他のコンパイラで必要と思われることを確認できます。 ClangとGCCはそれなしで動作します。 –

+0

私は、デストラクタ(cppファイルの空の実装さえ)を宣言しなければならないことは知らなかった!ありがとう!! – Brent81

0

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

0

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

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

QSharedDataPointerが要件を満たしているかどうかわかりませんが、ティブルはそれを言うと思われます。