不同类具有相同名称的C ++全局变量

时间:2020-11-12 17:13:02

标签: c++ class constants global-variables header-files

假设我有不同的类Knight,Spearman,Horseman,...具有完全相同的属性:m_health,m_damage,...(它们在某些方法上有所不同,因此类并不完全相同)。必须使用全局默认值在构造函数中对它们进行初始化,这些默认值与特定类相同,但在不同类之间有所不同。例如,所有骑士都拥有100点生命值和25点DMG,所有长矛手都拥有90点生命值和40 DMG,但是他们在各个职业之间有所不同。 我不想在类构造器中对这些值进行修改,例如

class Knight {
public:
    Knight(int health, int damage)
        : m_health(100, 25)
    {}
    ...
}

,而是将这些值放在单个头文件中,并在整个项目中使用它们。 最佳方法/做法是什么?

我尝试像这样创建 defaultstats.hpp

namespace Default {
    class Knight {
    public:
        static const int HEALTH = 100;
        static const int DAMAGE = 25;
    }

    class Spearman {
    public:
        static const int HEALTH = 90;
        static const int DAMAGE = 40;
    }

    class Horseman {
    public:
        static const int HEALTH = 120;
        static const int DAMAGE = 30;
    }
}

这样,我可以在需要全局变量的地方包含头文件,并以直观的方式访问它们:

Default::Knight::HEALTH

但这是最好的解决方案吗?我已经读到,初始化静态变量在顺序上是无法预测的,这在类和文件的较大层次结构中可能是个问题。

有效且直观地执行此操作是否有惯用语或模式?

1 个答案:

答案 0 :(得分:2)

只需将值粘贴在常规类中即可:

class Knight {
public:
    static const int HEALTH = 100;
    static const int DAMAGE = 25;
    
    Knight() : health(HEALTH),
               damage(DAMAGE) {}

    // ...
};

或者将它们附加在全局配置查询器中。这样,您以后可以根据需要从配置文件中读取值。

std::unordered_map<std::string, double> configuration;

class Knight {
public:
    Knight() : health(configuration.at("Knight::HEALTH")),
               damage(configuration.at("Knight::DAMAGE")) {}
    
    // ...
};