4

構造体をその基本型の 1 つにキャストするにはどうすればよいですか?

C# では、キーワード「as」を使用してそれを行うことができますEntity as Monster。c++ でこれを行うにはどうすればよいですか?

これは私の構造です:

struct Entity
{
    USHORT X;
    USHORT Y;
    UINT Serial;
    USHORT SpriteID;
};

struct Monster : Entity
{
    UINT UNKNOWN;
    BYTE Direction;
    USHORT Type;
};

struct Item : Entity
{
    BYTE UNKNOWN1;
    USHORT UNKNWON2;
};

struct NPC : Entity
{
    UINT UNKNOWN1;
    BYTE Direction;
    BYTE UNKNOWN2;
    BYTE NameLength;;   
    byte Name[];
};
4

2 に答える 2

8

C ++では、この可能性は、ポリモーフィック型(つまり、少なくとも1つの仮想関数を持つ型)のオブジェクトへのポインターに対してのみ存在します。あなたはでそれを行うことができますdynamic_cast<PtrType>

これが完全な例です(これもideoneにあります):

#include <iostream>
using namespace std;

struct A {virtual void foo(){}};
struct B {virtual void foo(){}};

int main() {
    A *a = new A();     
    B *b = new B();
    A *aPtr1 = dynamic_cast<A*>(b);
    cout << (aPtr1 == 0) << endl; // Prints 1
    A *aPtr2 = dynamic_cast<A*>(a);
    cout << (aPtr2 == 0) << endl; // Prints 0
    delete a;
    delete b;
    return 0;
}

;と互換性のないタイプのオブジェクトを指しているため、最初dynamic_castは失敗します。2番目は成功します。bA*dynamic_cast

于 2012-12-21T14:13:34.977 に答える
0

C++ の型キャスト演算子を見てみましょう。

http://www.cplusplus.com/doc/tutorial/typecasting/

Entity e;
Monster m = static_cast<Monster>(e);

Entity に少なくとも 1 つの仮想メソッドがあれば、次のことができます。

Monster * m = dynamic_cast<Monster*>(&e); // m != null if cast succeed

C# の "as" は では機能しないことに注意してくださいstruct。この場合static_cast、C++ の a に相当する C# のオブジェクトをキャストする必要があります。

変換が有効でない場合、プログラムは単にコンパイルされません。

于 2012-12-21T14:09:41.830 に答える