2016-11-02 5 views
3

問題は、オブジェクトの非動的割り当てによってコンパイルエラーが発生するようなクラスを作成することです。例えばオブジェクトを動的にしか割り当てられないC++クラスを作成するには?

Employee e1; // compiler error 
Employee *e3 = new Employee; // works fine 
+1

できません。あなたができる唯一のことは、コンストラクタをprivateにして、クラスの 'new'インスタンスを構築する' static'ファクトリを持たせることです。 –

+3

このようなクラス*を作成することは確かに問題です。解決策は、それだけではありません。真剣にも、これは私にとってXYの問題のように聞こえるし、意味のある答えを得るためには、これを行うことによって達成しようとしていることを教えてください。そしておそらく、最終目標を達成するためのよりよい方法を試すのに役立ちます。 –

+0

これは非常に奇妙な要件です。なぜあなたはそのような制限を課しますか?プログラマーが説明なしで普通にやることをやめさせようとするのは本当にイライラしています。 – tadman

答えて

0

は、クラス内のプライベートデストラクタを作成します。プライベートデストラクタを作成すると、コンパイラは非動的に割り当てられたオブジェクトに対してコンパイラエラーを生成します。これは、コンパイラはスタックセグメントからそれらを使用しなくなった後に削除する必要があるからです。

+0

そして、それらのオブジェクトを '削除する 'ことをどのように提案しますか? –

+0

私たちは友人の関数destruct()を作成します。これはクラスのユーザーがオブジェクトを破壊するために呼び出すことができます。 –

+0

これは逆のようです。新しいプレースメントを使用して回避することはできませんでしたか? – melpomene

2

コンストラクタをプライベートにして、オブジェクトに共有ポインタを返すファクトリを作成する必要があります。

5

あなたはこのような何か行うことができます:予想通り、以下を使用して動作しないことを

#include <memory> 

struct S { 
    static std::unique_ptr<S> create() { 
     return std::unique_ptr<S>(new S); 
    } 

private: 
    S() {} 
}; 

int main() { 
    auto ptr = S::create(); 
} 

注:

S() = default; 

私はそれはクラスが扱われているという事実によるものであると思います

S s{}; 

また、次のようなものがあります。はその作業を行うためのコンストラクタにアクセスできる必要があるためだが、コンストラクタがプライベートであるため、これは不可能であること

static std::unique_ptr<S> create() { 
    return std::make_unique<S>(); 
} 

:機能は、上記の例では動作しません。

+0

'S()= delete'を意味しましたか? – 0x499602D2

+0

@ 0x499602D2いいえ、私は 'S()= default;'を意味しました。この例で使用して、この行を 'main'関数に追加してみましょう:' S s {}; '。次に_unexpected_(?)の結果が表示されます。私はあなたのためにそれを行うだろうが、携帯電話からはゴッドボルトを使用することはできません。 :-( – skypjack

関連する問題