2017-02-02 6 views
6

私はOpenSplice DDSを使用しています。そこには、ほぼすべてのC++クラス(私が使用した基本的なもの、それについて言及することができます)がnew演算子にオーバーロードされています。私は理解していない、なぜ誰もそれを行うだろうか?誰かがこれの必要性を示すいくつかの例を提供することができますか?なぜあなたはオペレータ `new`をプライベートにするのですか?

私はnewを必要とする理由:これらのクラスのほとんどは、デフォルトコンストラクタを持っていない、と私はunique_ptrて、後で私の実装では、それらを初期化する必要があるため。

簡単なトリック:一方、私は非常に簡単にこれをトリックすることができます!私はこのクラスを別のクラスでラップすることができ、私が望むだけでnewを使用します。それゆえ、私はその動機を理解しておらず、悪いスタイルのように感じます。誰かが説明できますか?


EDIT:

ちょうど明確にする:エスケープすることができない、これは良い答えで良い例を提供します。 newオペレータがプライベートにしているのを見るすべての人に役立ちます。

+1

'private'、' protected'、 'public'が本当に導く以外何もしませんあなたのAPIの開発者/ユーザー。あなた自身の保護を回避することを選択した場合、C++でそれを行うほとんどの方法があります – stefan

+2

あなたは[this](http://stackoverflow.com/a/124857/1870232)を見ましたか? – P0W

+0

この質問は、ツール/ライブラリ/ SWに固有です。私はあなたにそれのためのタグがあったといい。 – P0W

答えて

3

埋め込まれたC++の多くは、システムの起動後に動的割り当てが行われないことを保証する必要があります。航空、自動車、医療機器業界は、この要件を満たすことが多い。その背後に、このようなコーディング標準と合理的なため、以下のリンクを参照してください:

2

あなたは厳密に新しくする必要はありません。

(ヒープ割り当てではなく)オブジェクトのスタック割り当てを強制的に禁止することはできません。考えてみましょう:

struct Point { 
    int x, y; 
}; 

Point * a = new Point{3, 5}; //sizeof(Point) in heap + sizeof(Point *) in stack. 
Point b{3, 5}; //sizeof(Point), directly in the stack 

をですから、new演算子を削除した場合またはそれがプライベート(前C++ 11)あなたは、ユーザーのためのプロトコルを強制します(C++ 11であなたが禁止したい場合は、それが正しい方法です) 。

禁止(ただし、削除しない)するもう一つの理由NEWINGおよびコンストラクタは、オブジェクトの工場のスマートポインタのいくつかの種類を返すことが考えられます。必要に応じて

class MyClass { 
private: 
    MyClass(); 
    void * operator new(...); 
public: 
    static std::shared_ptr<MyClass> create() { 
     //check if object in cache... 
     auto c = std::make_shared<MyClass>(); 
     //Do more stuff maybe 
     return c; 
    } 
}; 

これは、工場出荷時のコンストラクタで何かを強制するだろう、などキャッシュやその他のものを使用すると、外部ユーザーもnewを使用できなくなりますが、割り付けのためにクラス内で新しいものを使用することは許可されます(new演算子を削除した場合はこれ以上実行できません)。

+0

答えをありがとう、しかし私はこれを既に知っています。問題は、なぜスタック割り当てを強制するのでしょうか?これを正当化する良いスタイルのプログラミングは何かできますか?問題が 'sizeof'の場合、新しいものをプライベートとして設定しなくても、この問題を解決するには他にも何百万もの方法があります。これはバズーカでフライを殺すのが好きです。 –

+0

ベクターポイント(10000); 10000 * sizeof(Point)対ベクトル ptrpoints(10000); sizeof(Point)* 10000 + sizeof(Point *)* 10000。これは、ポインターが8バイトでintが32ビットのアーキテクチャーを想定して、必要なメモリーを2倍にします。私はそれが正当な理由だと思う。しかし、それはもちろん、クライアント側でどのように型を使用するかによって異なります。 –

+0

私のコメントはあなたの質問に答えますか?それがわかったら、私は直接それを返信に追加します。 @TheQuantumPhysicist –

3

理由誰[過newオペレータがプライベートであるため(それらを使用してからユーザーを防ぐために)]

おそらくオブジェクトをdirectly on heap(すなわち動的に)割り当て防止するであろう。

誰かがこの必要性を示すいくつかの例を提供できますか?

私はこれを必要とするものは何も知らない。このような決定に関する情報を見つけるための最良の情報源は文書です。それが文書化されていない場合は、開発者に尋ねることができます。

私は推測できます。私の推測では、デザイナーは、ユーザーが間違いを犯したり、動的オブジェクトを解放するのを忘れたり、存在しないオブジェクトを破壊または使用しようとすることをより困難にしたいと考えています。


EDIT:これは証明可能、公式ではありませんが、ユーザーがライブラリがcommented on their forum持って提供する会社の従業員としてタグ付け:

ISO C++ APIは、上で作成されたすべてのオブジェクトを持つように設計されて

これは、オブジェクトがまだ参照されているかどうかに基づいて、すべてのメモリ管理が自動的に行われるためです。 ISO C++オブジェクトのコピーではオーバーヘッドは発生しません。これは、基本オブジェクトのスマートポインタをコピーして、同じオブジェクトへの参照が2つになるためです。


これらのクラスのほとんどは、デフォルトコンストラクタを持っていない、と私は後でそれらを初期化する必要があるので...

必ずしもあなたが動的な割り当てを必要とすることを意味するものではありません。クラスにはデフォルトコンストラクタがないかもしれませんが、コンシューマにいくつかの正規の値を渡すことによって実現できる(例えば、nullptr)分かりやすいデフォルト状態を持つかもしれません。

+0

リンクをありがとう。それは参考になりましたが、フォーラムからの不合理な正当化だと私は言います。 +1 :) –

関連する問題