4

如何将结构转换为其一种基本类型?

在 c# 中,您可以使用关键字 "as" like 来做到这一点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++ 中,这种可能性只存在于指向多态类型对象的指针(即具有至少一个虚函数的类型)。您可以使用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失败,因为b指向与A*;不兼容的类型的对象。第二个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 至少有一个虚拟方法,你可以这样做:

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

请注意,C# 的“as”不适用于struct. 在这种情况下,您必须在 C# 中转换对象,这等效static_cast于 C++ 中的 a。

如果转换无效,您的程序将根本无法编译。

于 2012-12-21T14:09:41.830 回答