我正在使用基于代理的框架对人群进行建模。通常,区分雄性和雌性并不重要,除了动物繁殖时,在雌性中繁殖年龄的雌性很重要。这样,育种者必须将动物作为数据成员。我正在尝试最干净地实现此框架,但不确定当前的方法是否最佳。
我目前有一个名为Animal
的基类和一个名为Breeder
的派生类。 Breeder
有一个唯一的指针数据成员来表示其后代,该成员是动物类型:
#include <iostream>
#include <memory>
class Animal
{
private:
int id_;
protected:
int sex_; // 0 = female, 1 = male
public:
Animal() {};
Animal(int id): id_(id) { };
int get_id() const { return id_; };
};
class Breeder : public Animal {
public:
Breeder(int id) : Animal(get_id())
{
sex_ = 0;
id_b = id;
};
private:
int id_b;
std::unique_ptr<Animal> offspring;
public:
void give_birth() {
std::cout << "breeder " << id_b << " is giving birth" << std::endl;
offspring = std::make_unique<Animal> (id_b+1);
};
int get_id_b() { return id_b; };
int get_offspring_id() { return offspring->get_id(); };
};
我的问题是让派生类具有属于基类的成员变量感到很尴尬。尴尬吗?
此外,育种者可以访问fpsring的公共成员函数/变量的个体,但是推测后代应该能够“了解”其母亲,因此基类可以具有指向派生类的指针成员。
有没有更好的方法来解决这个问题?也许使用合成的两个不同的类?例如,育种班是否应该具有生育的功能?
答案 0 :(得分:3)
我的问题是让派生类具有属于基类的成员变量感到很尴尬。尴尬吗?
完全没有(必要)。如果这符合您的领域逻辑,那可能是一个很好的解决方案。
答案 1 :(得分:1)
这正是对象的链接列表的外观。
一旦将您的一个后代更改为多个后代的集合,这将完全是一棵对象树的外观。
一点都没有错。继续。 ?
次要风格建议:将sex_
设为具有enum class
和Male
成员的Female
,而不是int
,仅在注释中给出映射。当您将视线从声明中移开时,您会更容易阅读,并且也避免了错误。