这是我的问题,经过简化:
枚举AnimalType_t
{
狗= 0,
GREY_HOUND = 1
IMMORTAL_JELLYFISH = 2
};
结构RawData_t
{
年龄
AnimalType_t typeOfAnimal;
};
RawData_t GetMyCurrentRawData(); //返回当前原始数据
bool IsDataReady(); //如果数据准备就绪,则返回true,否则返回false
动物类
{
上市:
虚拟Animal();
虚拟〜Animal();
int GetType(){return rawAttributes.typeOfAnimal; }; //所有子代的唯一实现
虚拟int GetAge(){return rawAttributes.age; }; //要在子类中实现
虚拟void UpdateAge(){rawAttributes.age ++; }; //要在子类中实现
虚拟int GetNumberOfLegs()= 0; //要在子类中实现
私有(private)的:
RawData_t rawAttributes;
}
狗类:公共(public)动物
{
上市:
Dog(RawData rawData):动物(rawData){};
int GetNumberOfLegs(){return 4;};
};
GreyHound类:公犬
{
上市:
GreyHound(RawData rawData):Dog(rawData){};
};
类ImmortalJellyFish:公共(public)动物
{
上市:
ImmortalJellyFish(RawData rawData):Animal(rawData){};
int GetNumberOfLegs(){返回0;};
void UpdateAge(){return;}覆盖;
};
类 build
{
上市:
建造(){};
//很抱歉排长队,但您知道了...
int Display(void){if(IsDataReady())DisplayOnScreen(“此动物(” + animal_m.GetType()+“)具有” + animal_m.GetNumberOfLegs()+“腿,并且是” + animal_m.GetAge()+“岁\ n“;};
int Live(void){currentDiagCode_m.UpdateAge();};
私有(private)的:
auto animal_m; // ??不工作
};
静态建筑围场;
静态建筑农场;
无效的Buildings_Step(无效)
{
paddock.Live();
paddock.Display();
farm.Live();
farm.Display();
}
这是我在努力的地方:
换句话说:可以使用静态分配进行动态类型化吗?
然后,如何调用这些实例,以便调用正确的方法?
这是我的约束条件:
我不过是:
具有unique_ptr的
是否有可以满足我需求的设计/模型?
谢谢!
最佳答案
在C++中,内存分配和对象存在是两个独立的概念,即使在大多数情况下,您也可以将两者一起处理。但是,就您而言,您可能希望将两者明确分开:
char buf[N]; // N >= sizeof(T) for all T in your hierarchy
new (buf) GreyHound(args);
reinterpret_cast<Animal*>(buf)->~Animal();
也就是说,您将存储作为容器对象的一部分来获取,但是可以通过放置新的显式销毁来动态管理Animal对象的生存期。
还有一点:您的内存还需要针对其中构造的所有类型正确对齐。您可以使用诸如
std::aligned_storage
或std::aligned_union
之类的一些库帮助程序特征来简化计算,尽管您可能仍需要做一些工作来计算大小和对齐方式。作为完全独立的替代方法,您可以放弃多态类的层次结构,而改为使用
std::variant
。这在概念上相似,但在实现方式上有所不同。从概念上讲,这是相似的原因是因为您有一组有限的类型,所以您实际上不需要多态即可在运行时处理任意的,未知的派生类型。