2016-05-25 2 views
3

メカニズムを私は自律的プロセス監視のためのヘルパークラスを持って、そしてそれは「火と忘れて」ビットだとして、大きな落とし穴は、あなたがこのようにそれを使用することができるということです。クラスのローカルインスタンス化を禁止できますか?

のMyClassのC(プロセス)。

しかし、cが範囲外になると、スレッドの内部が停止し、明らかに通知が出なくなります。あなたがそれを行う必要がありますどのように

は、このようなものです:

のMyClassの*のC =新しいMyClassの(プロセス)。

あなた自身の生涯を処理します。

ローカルインスタンシエーションを禁止し、C++でのみ「新規」を許可するのは簡単で良い方法ですか?

乾杯!

Valmond

答えて

6

を通じてそれをしない、友人関数を介してインスタンス化を許可し、その後、コンストラクタをプライベートと作ることができます割り当て解除のために)。これは、クラスの直接スタックインスタンス化を禁止し、ヒープ(new)のインスタンス化のみを許可します。

注:これは、コンストラクタをプライベートにするよりも優れています。なぜなら、オブジェクトは関数ではなく直接作成できるからです。民営化する必要があるデストラクタは1つだけですが、多くのコンストラクタが存在する可能性があります。

削除を行うには、次のようなものを実装することができます「あなたはそれを行う必要がありますどのように... new MyClass

struct MyStruct 
{ 
    void free() 
    { 
     delete this; 
    } 

private: 
    ~MyStruct() {}; 

}; 

int main() 
{ 
    MyStruct* s = new MyStruct; 
    s->free(); 
} 
+0

プライベートコンストラクタまたはデストラクタのメソッドを宣言する以外にも、次のような独自の型を宣言してスマートポインタを使用する方法があります。 typedef std :: unique_ptr PtrMyClass; しかし、それはエレガントな方法ではありません。 – LmTinyToon

+0

さて、私はパブリックメンバー関数を使ってデストラクタを呼び出しますが、削除はどのように行いますか? – Valmond

+0

申し訳ありませんが、私はばかだ、私はちょうど(パブリックメンバー関数、歓声と感謝の削除を行う)! – Valmond

4

あなたはクラスのデストラクタをプライベートに(代替メンバ関数を定義することができ、常に新しい

3

をいいえ、それはあなたがそれをやるべき方法ではありません。それはメモリリークを要求しています。

良い方法は

class MyClass { 
    MyClass(Process const&); 
public: 
    static std::unique_ptr<MyClass> make(Process const&); 
} 

これは確かにMyClass c {process};を書いてから発信者を防ぐことです。

もちろん、new MyClassのあなたのアイデアも絶対的な防止でもありません。両方のポインタはどこかに格納する必要があります。どちらかを関数ローカルstd::unique_ptr<MyClass>に保存すると、元々の問題と同じ問題が発生します。

+0

答えがありがとうございますが、実装ではいくつかのインスタンス化の使用が制限されています。 – Valmond

+0

@Valmond:いいえ、まったくありませんか?実際に、単一のインスタンス化がある場合、 'std :: unique_ptr 'を返すことはできません。 'MyClass :: make()'を2回呼び出すと、1つのインスタンス化を指していると明らかにユニークではない2つの 'unique_ptr'が得られます。 – MSalters

+0

@MrSaltersさて、私の誤解を解消してくれてありがとう! – Valmond

関連する問題