2017-03-28 11 views
0

あなたはQScopedPointerはヘッダで宣言されていることができます:QScopedPointer宣言、SRCで定義

QScopedPointer <T> _name; 

とする.cpp定義/インスタンス化で:

_name (/*new T*/); 

注:私は承知していますQScopedPointerはこれを行うための演算子を持っていませんが、概念的にはこれは何とか補完できますか?

答えて

1

私たちは クラス宣言をヘッダにQScopedPointer<T> -typedクラスのメンバを使用することはできますか?

はい。タイプTが定義または宣言のどちらかということを確認してください:

/// 
/// File MyClass.h 
/// 

// Either have: 
#include "MyType.h" // defines MyType 

// Or: 
class MyType; // forward declaraion 

class MyClass 
{ 
public: 
    MyClass(); 
    //// 
private: 
    QScopedPointer<MyType> m_pTypeObj; 
}; 

しかし、あなたは常にあなたがオブジェクトをインスタンス化し、そのQScopedPointer<MyType>にポインタを格納タイプに定義されている必要があります。

として
#include "MyClass.h" // defines MyClass 
// If not through MyClass.h then must have: 
#include "MyType.h" // defines MyType 

MyClass::MyClass() 
{ 
    // now we can instantiate MyType 
    m_pTypeObj.reset(new MyType); 
    // and use the scoped pointer 
    m_pTypeObj->method(); 
} 

それともを著者は意味:

MyClass::MyClass() : m_pTypeObj(new MyType) 
{ 
    // and use the scoped pointer 
    m_pTypeObj->method(); 
} 

アプローチは今を置き換えることができたstd::unique_ptrにも適用可能です。

+0

デフォルトのdtorはオブジェクトの定義を必要とするため、最初のサンプルはコンパイルされません。前方宣言でQScopedPointerを使用する場合は、.cppファイルでdtorを定義する必要があります。 –

+0

正しい:*オブジェクトをインスタンス化する場所に常に型を定義する必要があります* – AlexanderVX

関連する問題