C++ 有没有一种方法可以根据可能值的派生类范围来限制对象参数?

C++ 有没有一种方法可以根据可能值的派生类范围来限制对象参数?,c++,oop,inheritance,C++,Oop,Inheritance,我想建立一个动物数据库。如何使每个动物物种都有一些固定值的参数和一些可能值的范围,以便每个物种的个体(对象)可以从中“选择” 从基本的面向对象编程,我可以有一个类狗,对象是“Rex”和“Fido”,然后是一个类鸟,对象是“Rocky”和“Coco”。我为它们创建了一个基类,class Animal,其参数对所有人都是通用的,如下所示 当我创建类狗时,我如何修复我希望所有狗拥有的身体部位(所有狗都有头、腿、尾巴等,但没有翅膀),以及我如何为类狗的每个对象设置一系列可能的值以供选择(因为狗可能是黑色

我想建立一个动物数据库。如何使每个动物物种都有一些固定值的参数和一些可能值的范围,以便每个物种的个体(对象)可以从中“选择”

从基本的面向对象编程,我可以有一个类狗,对象是“Rex”和“Fido”,然后是一个类鸟,对象是“Rocky”和“Coco”。我为它们创建了一个基类,class Animal,其参数对所有人都是通用的,如下所示

当我创建类狗时,我如何修复我希望所有狗拥有的身体部位(所有狗都有头、腿、尾巴等,但没有翅膀),以及我如何为类狗的每个对象设置一系列可能的值以供选择(因为狗可能是黑色、棕色或白色,可能是两者的混合,但绝不是绿色或蓝色)

#包括
#包括
枚举类主体部分
{
头,,
翼
...,
尾巴;
};
枚举类颜色
{
黑色
红色
白色
布朗,
绿色
蓝色
};
类动物
{
公众:
动物();
~Animal();
私人:
std::字符串m_物种;
std::向量m_肢体;
std::向量m_颜色;
}
动物类
{
公众:
动物(标准::病媒允许的颜色,标准::病媒需要的肢体)
:m_肢体(必需肢体)、m_颜色(允许颜色)
{}
// ...
};
然后,每个派生类必须在构造时决定什么是允许的,什么是不允许的

然而,这段代码中存在一些混淆,可能需要完全不同的设计

  • 一个动物实例(“岩石”)可以有几个肢体,但只有一种颜色(我想是吧?)。那么为什么
    动物的每个实例都有一个颜色列表呢

  • 分配/提供肢体和颜色应该是
    动物
    基类的工作还是每个派生类的工作?谁是此代码的用户,他们应该做什么?设置肢体和颜色?如果是这样,这应该是一个
    动物
    界面,还是每个
    都有自己的颜色决定方法

  • 肢体是一个“必需”列表(给定动物类型的每个实例都需要有所有这些肢体),但颜色是一个“允许”列表(给定动物类型的每个实例都需要有其中一种颜色)。这在意义上是一个相当显著的差异,目前在代码中没有反映出来

  • 但问题是“拥有”一个给定的肢体意味着什么。因为独角兽的
    m_肢
    列表包含两个
    WING
    s,所以它是完整的吗?如果每个独角兽都需要它,这有什么帮助?
    m_Limb
    列表是否说明了动物实例,或者它实际上只是描述了动物的种类

  • 在我看来,所需肢体和允许颜色的列表不应该存储在每个动物实例中,而应该是派生类型的某些属性(例如,
    )。当你想用属性注入类型时,你倾向于离开OOP区域,进入模板区域

动物类
{
公众:
动物(标准::病媒允许的颜色,标准::病媒需要的肢体)
:m_肢体(必需肢体)、m_颜色(允许颜色)
{}
// ...
};
然后,每个派生类必须在构造时决定什么是允许的,什么是不允许的

然而,这段代码中存在一些混淆,可能需要完全不同的设计

  • 一个动物实例(“岩石”)可以有几个肢体,但只有一种颜色(我想是吧?)。那么为什么
    动物的每个实例都有一个颜色列表呢

  • 分配/提供肢体和颜色应该是
    动物
    基类的工作还是每个派生类的工作?谁是此代码的用户,他们应该做什么?设置肢体和颜色?如果是这样,这应该是一个
    动物
    界面,还是每个
    都有自己的颜色决定方法

  • 肢体是一个“必需”列表(给定动物类型的每个实例都需要有所有这些肢体),但颜色是一个“允许”列表(给定动物类型的每个实例都需要有其中一种颜色)。这在意义上是一个相当显著的差异,目前在代码中没有反映出来

  • 但问题是“拥有”一个给定的肢体意味着什么。因为独角兽的
    m_肢
    列表包含两个
    WING
    s,所以它是完整的吗?如果每个独角兽都需要它,这有什么帮助?
    m_Limb
    列表是否说明了动物实例,或者它实际上只是描述了动物的种类

  • 在我看来,所需肢体和允许颜色的列表不应该存储在每个动物实例中,而应该是派生类型的某些属性(例如,
    )。当你想用属性注入类型时,你倾向于离开OOP区域,进入模板区域


    • 显然,我所尝试的并不是真正需要的。在与一位朋友交谈后,他说,因为我正在做一个数据库,所有这些都是在用户界面中完成的,我不需要类,也不需要它的子类。他说我将为每个“类和子类”创建一个简单的类,只用于获取用户输入并记录到文件中。向用户加载屏幕上的信息时,应添加限制

      使用上面的例子,我将狗和鸟的数据放在一个类似txt的文件中:

      (animal,body1-body2-...-bodyN,color1-color2-...-colorN)
      

      当我尝试添加一个“dog object”(如“Fido”)时,屏幕上只有dog信息可用,因此“Fido”将被记录为:

      (Fido,head-teeth-tail,black)
      
      这样,我需要为每个动物物种创建一个类,然后为每个物种的个体创建另一个类,并向用户添加约束,而不是向类添加约束。 谢谢大家,反正都很有帮助。

      (animal,body1-body2-...-bodyN,color1-color2-...-colorN)
      
      (dog,head-teeth-tail,black-brown-white)
      (bird,head-beak-wing-tail,black-white-yellow-green-red)
      
      (Fido,head-teeth-tail,black)