我应该在简单的策略游戏中为单个派系使用类吗-C ++

时间:2018-10-19 16:28:25

标签: c++ class inheritance

我决定挑战自己,用C ++创建一个简单的Risk-type策略游戏。该游戏将有多个派系争夺使用各种类型的部队/单位的领土控制权。

我只参与游戏的基本概述,但是我的一个基本想法是为每个派系创建一个类:

class Windows {
private:
    bool isWindows = true;
    // Characteristics etc.
};

class Mac {
private:
    bool isMac = true;
    // Characteristics etc.
};

class Linux {
private:
    bool isLinux = true;
    // Characteristics etc.
};

在此之后,单位的各个类别将继承与之关联的派系的某些特征,例如:class Penguin: private Linux {//Code};

这是执行此操作的最佳方法吗?还是有更少的类而更好的方法?

2 个答案:

答案 0 :(得分:2)

如果各派别具有相似性,则使用基类,并且它们将每个派别的单独子类和派别类作为单位的基类。

答案 1 :(得分:1)

听起来好像不同的派系对于同一组特征具有不同的设置,这表明您应该拥有一个Faction类,并且具有不同的Faction实例。

我假设每个派系只需要一个实例。它们可以是一种单例。在c ++中,单例的惯用方式是使用一个函数,该函数返回对局部静态变量的引用:

class Faction {
    // Characteristics etc.
};

const Faction& windows() {
  static Faction f{ /* initialize with windows characteristics */ };
  return f;
}

const Faction& mac() {
  static Faction f{ /* initialize with mac characteristics */ };
  return f;
}

const Faction& linux() {
  static Faction f{ /* initialize with linux characteristics */ };
  return f;
}

然后,像Penguin这样的类可以使用Faction的Linux实例,而不是从Faction继承。例如,它可以引用其派系:

class Penguin {
    const Faction& faction = linux();
public:
    void someAction() {
        // use faction reference
    }
};

我建议您尝试避免使用“ isLinux”之类的检查,因为它会使代码变得脆弱,而应依赖于派系对象本身的特征。如果引入新的派系,则更改的代码越少越好。如果确实需要检测派系的类型,则由于派系实例是单例,因此可以比较地址:

bool isWindows(const Faction& f) { return &f == &windows(); }
bool isLinux(const Faction& f) { return &f == &linux(); }
bool isMac(const Faction& f) { return &f == &mac(); }

如果执行此操作,最好防止复制Faction对象,以便您可以将其放在正确的地址上:

class Faction {
    // ...

    // uncopyable
    Faction(const Faction&) = delete;
    Faction& operator=(const Faction&) = delete;
 };

Live demo