【发布时间】:2019-08-05 13:15:08
【问题描述】:
我正在尝试创建一个动物数据库。如何让每个动物物种都有一些具有固定值的参数和一些具有一系列可能值的参数,以便每个物种的个体(对象)可以从中“选择”?
从基本的 OOP 开始,我可以有一个 Dog 类,包含对象“Rex”和“Fido”,然后是一个 Bird 类,包含对象“Rocky”和“Coco”。我为它们创建了一个基类,Animal 类,其参数对所有人都是通用的,如下所示。
当我创建 Dog 类时,我如何修复我希望所有狗都拥有的 Body_Parts(所有狗都有头、腿、尾巴等,但没有翅膀)以及如何为每个狗设置一系列可能的值可供选择的 Dog 类对象(因为狗可能是黑色、棕色或白色,也可能是两者的混合,但绝不是绿色或蓝色)?
#include <string>
#include <vector>
enum class Body_Part
{
HEAD,
WING,
...,
TAIL;
};
enum class Color
{
BLACK,
RED,
WHITE,
BROWN,
GREEN
BLUE;
};
class Animal
{
public:
Animal();
~Animal();
private:
std::string m_Species;
std::vector<Body_Part> m_Limbs;
std::vector<Color> m_Colors;
}
【问题讨论】:
-
为什么不使用字符串数组/向量?是的,它们占用更多空间,但除非您使用嵌入式硬件,否则您永远不会注意到它,并且它允许您拥有无限的灵活性。
-
您是否也想对诸如“只有带翅膀的独角兽可以是蓝色的”之类的要求进行建模?或者这个列表是每个子类固定的?
-
@Werneck 好吧,除了可能的数量之外,身体部位不应该是用户可以控制的东西。你有一张
<string, int>的地图,然后用户可以控制该对象有多少条腿/眼睛/翅膀,但不能更改它的构建属性。 -
您可能需要多考虑一下您的项目设计。你应该能够创建一个
Animal实例吗?或仅例如Cat或Dog实例?然后确保没有人可以创建Animal类的实例(使构造函数受保护),并在子类Cat或Dog中初始化颜色和正文部分。 -
您可以使用默认值填充地图,然后让用户能够更改这些值,例如
std::map<std::string, int> body_parts{{"legs", 4},{"eyes",2}.{"ears",2}, ...}
标签: c++ oop inheritance