次の構文はどういう意味ですか?
typedef void* hMyClass; //typedef as a handle or reference
hMyClass f = &something;
const MyClass& foo = static_cast<MyClass&>(*f);
foo.bar();
次の構文はどういう意味ですか?
typedef void* hMyClass; //typedef as a handle or reference
hMyClass f = &something;
const MyClass& foo = static_cast<MyClass&>(*f);
foo.bar();
static_cast は、ある参照型から別の参照型に変換するときに、変換するものが実際にターゲット型のインスタンスであることをシステムが実際に確認しようとしないことを意味します (動的キャストとは異なります)。
したがって、hMyClass に含まれ、何かに由来するアドレスに MyClass のインスタンスが実際に含まれていることを十分に認識できるほど賢明であり、次の場合に発生する予測不可能なことに対して完全な責任を負うことをコンパイラに伝えています。間違っている。
あなたの「何か」はどのタイプですか?そこでエラーになることもあります。&何かが必要かもしれません。
これは実際には有効ではありません。2行目の変数ではなく、型に値を割り当てています。
これが何を意味するのかを正確に言うのは、文脈がなければ難しいです。あなたは他の誰かのコードに取り組んでいて、あなたが示している行は多くの関数に散らばっているように見えると思います。
コードの意図に関する私の推測では、これはサードパーティのコード/ライブラリを処理するためのメカニズムであるということです。C++ では、(テンプレート化されていない) サードパーティ ライブラリを独自の型で使用するのが一般的です。それらのライブラリが、あなたが作成して所有しているデータを一時的に保持する必要がある場合、ライブラリがあなたの型を認識していなくても、ライブラリにあなたのデータへのアクセスを許可する方法が必要です。1 つの例は、コールバック/イベント機能です。イベントが発生したときにライブラリが非同期に通知する場合は、関数ポインタとユーザー定義データを渡す必要があります。これにより、関数が呼び出されたときにそれをどう処理するかがわかります。ライブラリは通常、このユーザー提供のデータに対して void* ポインターを使用します。C++ では、ユーザーが指定したデータのオブジェクト インスタンスを渡すだけで、そのオブジェクトにデリゲートしてコールバックを処理するのが一般的です。ここ'
// 3rd-party library API
typedef void (*PingNotifyPtr)(void*);
void NotifyOnPing(PingNotifyPtr, void* userData);
// User Code
void MyNotify(void* myData)
{
MyClass* ptr = (MyClass*)myData;
// do something with ptr
}
void Main()
{
MyClass *pClass = new MyClass();
NotifyOnPing(&MyNotify, pClass);
// the callback is now armed with all the data it needs.
}
多くのライブラリは、「void*」引数を宣言することでこれを実現しています。これは、あるメモリ位置への生のポインタです。その場所には、整数、クラス インスタンス、文字列など、あらゆるものが存在する可能性があります。サードパーティ ライブラリはそのポインタを保持し、ある時点でそれをコードに返します。
サンプル コードの 3 行目は、void* ポインターを取得し、それをクラス インスタンスへの参照にキャストしています。C++ 参照はポインターに似ていますが、NULL にすることはできず、値構文を使用します (たとえば、'->' 演算子の代わりに '.' 演算子を使用します)。サンプル コードの 4 行目では、re-構成されたクラス インスタンス。
とにかく、扱っているコード ベースで 4 行すべてのコードが連続している場合、そのコードは誰かが C++ を知らないことを意味します。同じコードを 1 行で実行する、よりコンパクトな方法を次に示します。
((const MyClass*)something)->Foo();
または、値の構文を好む場合:
(*((const MyClass*)something)).Foo();
幸運を!
基本的に、誰かが MyClass ポインターを void ポインターに格納し、それをコールバックに渡している可能性があります。おそらくコールバックされたこのコードは、MyClass として使用するためにキャストバックされます。
また、eagerwishes が指摘しているように、構文エラーもあります。
void* は一般的にジェネリック ポインターに使用されます。
C# では、次のようになります。
object o = new XmlDocument();
オブジェクト o = 新しいリスト();
ただし、C++ では、強制される型の安全性はほとんどありません。IIRC、static_cast は、実行時の型チェックが行われないという点で (キャスト) と同じです。