【问题标题】:c++ global variables with same name for different classesc++ 不同类同名的全局变量
【发布时间】:2021-02-24 17:34:29
【问题描述】:

假设我有不同的职业骑士,矛兵,骑士,......具有完全相同的属性:m_health,m_damage,......(它们在某些方法上有所不同,因此类不完全相同)。它们必须在构造函数中通过 全局默认值 进行初始化,这些默认值对于特定的类是相同的,但在不同的类中会有所不同。例如,所有骑士都有 100 HP 和 25 DMG,所有 Spearmen 有 90 HP 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

但这是最好的解决方案吗?我读过初始化静态变量在排序方面是不可预测的,这可能是类和文件的大层次结构中的一个问题。

有没有一种习惯用法或模式可以有效且直观地做到这一点?

【问题讨论】:

  • 我只是将默认值放在class Knight { ... 中,而不是在不同的命名空间中创建单独的 Knight 类

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


【解决方案1】:

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

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")) {}
    
    // ...
};

【讨论】:

  • 我可能想多了这个问题。这个解决方案看起来简单合理。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多