C++ 比较从同一基类继承的两个类实例的最佳方法

问题描述 投票:0回答:1

我有2节课

class State : public godot::Node
    {
         

    public:
        State();
        virtual ~State() = default;
        virtual void _physics_process(double delta) override;
        virtual void enter();
        virtual void exit();
        virtual void update(double delta);
        virtual void _ready() override;


    protected:
        static void _bind_methods();
        Player* player;
    private:
        



    };


class WalkingPlayerState : public State {
         

    public:
        WalkingPlayerState() {
        };
        virtual ~WalkingPlayerState() = default;
        void update(double delta);
        

    protected:
        static void _bind_methods() {};
    private:
    
}


class IdlePlayerState: public State {
         

    public:
        IdlePlayerState() {};
        virtual ~IdlePlayerState() = default;
         
        void update(double delta);
     
        
    protected:
        static void _bind_methods() {};
    private:
}

好的,所以在代码中的某个地方,我想比较 WalkingPlayerState 和 IdlePlayerState。我的意思是检查指针的类型是否为 WalkingPlayerState 或 IdlePlayerState。

想象一下我有一本包含所有状态的字典

State* state =  stateNodes[i];

现在我想检查是否

state == WalkingPlayerState or IdlePlayerState 

现在我想检查 state 是否等于 WalkingPlayerState 或 IdlePlayerState。在 C++ 中如何做到这一点?我是否需要在每个类中包含一个字符串/枚举成员,或者是否有更好的方法来做到这一点而不添加额外的成员?

c++ class compare
1个回答
0
投票

对于运行时检查,您可以使用动态强制转换,它尝试从输入类型强制转换为给定的模板类型,并返回模板化类型的指针,或者如果强制转换失败则返回 nullptr...以及一个简单的if 语句会自动将其视为 true/false...

#include <iostream>
#include <type_traits>

class Base
{
public:
    virtual ~Base(){};
};

class Derived1 : public Base
{
public:
    virtual ~Derived1(){};
};

class Derived2 : public Base
{
public:
    virtual ~Derived2(){};
};

int main()
{
    // Create derived object
    Derived1 object;
    // Get base pointer from derived object
    Base* object_ptr = &object;

    // Check if base object pointer is either of the two derived types
    if (dynamic_cast<Derived1*>(object_ptr) || dynamic_cast<Derived2*>(object_ptr))
    {
        std::cout << "Pointer is one of those!" << std::endl;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.