GDExtension 中自定义类添加进 Array 等容器时发生的类型转换问题

我们有如下自定义类:

class Enemy: public CharacterBody2D {
    GDCLASS(Enemy, CharacterBody2D);
    
public:
    Enemy();
    ~Enemy();

    static void _bind_methods();

    void set_name(String name);
    [[nodiscard]] String get_name() const;
    void set_hp(int hp);
    [[nodiscard]] int get_hp() const;

private:
    String name;
    int hp;
};

随后我们将其添加进Array中

    Array array;
    Enemy *enemy = memnew(Enemy);
    array.push_back(enemy);

但当我们将其拿出来的时候,意外发生了

    Enemy *enemy2 = array[0];

编译时爆出了这个错误
error C2440: “初始化”: 无法从“godot::Variant”转换为“Enemy *”
原来它的类型已经在我们不知不觉间被隐式转换为了Variant

这时候我们把它在转回来

    Enemy *enemy2 = Object::cast_to<Enemy>(array[0]);
    //也可直接这样写
    //Enemy *enemy2 = Object::cast_to<Enemy>(array[0].operator godot::Object *());
    enemy2->set_hp(100);
    UtilityFunctions::print("enemy2.get_hp() = ", enemy2->get_hp());

经过这么一番折腾,我们将其转回了Enemy*,可以看到也成功的调用了其方法
成功转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值