我决定挑战自己,用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};
这是执行此操作的最佳方法吗?还是有更少的类而更好的方法?
答案 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;
};