2012-05-08 8 views
0

Javaでは、 'Class'メソッド 'newInstance'を使用してオブジェクトをインスタンス化できます。私は現在、C++で同様のことを達成しようとしています。sizeof、malloc、およびキャストを使用したC++オブジェクトのインスタンス化

これはどのように達成されるかもしれませんが、いくつかのリフレクションの後ではわかりませんでした(あなたはそれを得るのですか...そうですか?)私は、ClassDescriptionクラスを作成することで可能かもしれないと思います。クラスインスタンスの 'sizeof'属性を保持する属性と、この量のメモリをmallocしてvoid *として返すnewInstanceメソッドです。呼び出し側のコードはこれを適切にキャストする必要があります。

C++言語は、これが有効かどうかを適切に定義していますか?

ところで..私は、バックアップ計画であるクラスのファクトリを持つレジストリを作成できることを認識しています。この質問への回答については、私が議論したことがうまくいくかどうかという特定の質問に重点を置くことが重要です。

よろしく

*追加のコンテキスト*この要件のため 理由は、ライブラリのユーザーは、ライブラリ自体の意識ではなく、あるクラスをインスタンス化する汎用的なライブラリーを可能にすることです。ライブラリは、これを達成するために使用するいくつかのメタデータを持ち、クラスのサイズを伝えることができます。ユーザーの視点からは、メタデータにファクトリオブジェクトを追加する必要がないように、「きれい」です。

+1

あなたのクラスにプライベートコンストラクタを与えて静的メソッドから 'new Class'を呼び出すのはなぜですか? mallocは使用しないでください。クラスコンストラクタはあなたのために呼び出されません。 – Benj

+0

C++でオブジェクトインスタンスを割り当てるために 'malloc'が使われないのはなぜですか? –

+0

このルートを下りたい場合は、[placement new](http://stackoverflow.com/questions/222557/cs-placement-new)をご覧ください。 – tinman

答えて

4

これは場合によっては有効です。このタイプは、タイプが"plain old data type" (POD)see also this answer)である必要があります。複雑なものがあれば(仮想メンバ関数、仮想メンバ関数を持つメンバ、ベースクラスもPODなどでなければならない)、それは動作せず、未定義の動作です。実行して

することはできcheck if a type meets these requirements:一般的に

#include <type_traits> 

static_assert(std::is_pod<A>::value, "A must be a POD type."); 

それはおそらく、あなたはそれが間違ってやっていることを示しているけれども。 C++はJavaではないので、潜在的な実際の問題を解決するにはおそらくもっと良い方法があります。

+0

あなたのリンクは 'type_traits'がC++ 11であると言っています...この場合、このアプローチの有用性が制限されます... – user1055604

+0

@ user1055604 - boostに' is_pod'がありますが、その有用性は、 C++ 11 IIRC。あなたが自分の賭けをしたいなら、あなたはアサーションなしでもいつでもそれを行うことができます。そしてMSVCと最近のGCCだけでなく、これをサポートしています。それはまた、私が信じるTR1にもあります。これは、C++ 11よりも若干前です。この回答には、このタイプの動作の要件が合法であることが記載されており、コードで満たされていることを確認する方法が示されています。 – Flexo

2

mallocとキャストの方法に欠けているものは、オブジェクトの構築です。 newを使用すると、両方ともメモリを割り当てて構築します。これには、vテーブルの作成、コンストラクターの呼び出しなどが含まれます。型キャストmalloc割り当てられたメモリが無効です。

0

正しいサイズのメモリブロックを作成すると、生のメモリが得られます。このメモリブロックに目的のクラスのオブジェクトを構築する必要があります。これはplacement newを使用して実現できます。

関連する問題