0

Java では、'Class' メソッド 'newInstance' を使用してオブジェクトをインスタンス化できます。これは、私の特定のシステムでは非常に役立つと思います。私は今、C++で同様のことを達成しようとしています。

これがどのように達成されるかは私には明らかではありませんでしたが、いくつかの熟考の後....(わかりましたか...ハァッ?)「 sizeof' クラス インスタンスと、この量のメモリを malloc して void * として返すメソッド newInstance 。呼び出しコードは、これを適切にキャストする必要があります。

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

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

よろしくお願いします

* 追加のコンテキスト * この要件の理由は、汎用ライブラリが、ライブラリ ユーザーが認識しているがライブラリ自体は認識していないクラスをインスタンス化できるようにするためです。ライブラリには、これを実現するために使用するメタデータがいくつかあるため、クラスのサイズを知ることができます。ファクトリ オブジェクトをメタ データに追加する必要がないことは、ユーザーの観点からは「すっきり」しています。

4

3 に答える 3

4

これは場合によっては有効です。要件は、型が「プレーンな古いデータ型」(POD)である必要があることです(この回答も参照してください)。より複雑なもの (たとえば、仮想メンバー関数、仮想メンバー関数を持つメンバー、基底クラスも POD でなければならないなど) がある場合、それは機能せず、未定義の動作になります。

次のようにして、タイプがこれらの要件を満たしているかどうかを確認できます。

#include <type_traits> 

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

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

于 2012-05-08T09:49:28.837 に答える
2

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

于 2012-05-08T09:49:35.343 に答える
0

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

于 2012-05-08T09:52:41.457 に答える