2016-05-25 8 views
1

コピーコンストラクタまたは代入演算子を持たないクラスがあります。そのクラスのインスタンスを作成して初期化する必要があります。それ、どうやったら出来るの?問題(例)とコピーコンストラクタなしでクラスの静的インスタンスを初期化する方法>

コード:

class Q 
{ 
    int w; 
    public: 
    Q():w(19){}; 
    Q(const Q&) = delete; 
    Q& operator = (const Q&) = delete; 

    static Q sQ; 
}; 

Q Q::sQ = Q(); 

On ideone

ユースケース:私はQObjectから派生したクラスを持っているので、その代入演算子を持っており、コンストラクタは削除コピーします。利用可能なクラスの静的インスタンスが存在する必要があります。どのように達成できますか?

+0

シンプルな 'Q Q :: sQ;'はあなたのために機能しませんか? – HolyBlackCat

+2

コピーエリミッションを保証する提案があるので、このようなコードは削除されたコピーコンストラクタやムーブコンストラクタでもコンパイルされます。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html – Brian

+0

あなたのQのすべてが同じ赤ちゃんQで同時に妊娠しているようです。好奇心、妊娠そのものを無限に繰り返す。 Q Q :: sQの定義を採用しています。 HolyBlackCatが提案したメンバ関数void f(){std :: cout << "smoke and mirrors \ n"; }今できること \t Q q; \t q.sQ.sQ.sQ.sQ.sQ.sQ.sQ.sQ.sQ.sQ.sQ.f(); – Loreto

答えて

4

あなたがuniform initialization syntaxを使用し、中括弧

Q Q::sQ{}; 

の空のセットを持つクラスを構築するか、あなたも同様に中括弧をドロップすることができますすることができます: sQを構築デフォルトになります

Q Q::sQ; 

両方。