这是我的问题,得到简化:
enum AnimalType_t { DOG = 0, GREY_HOUND = 1, IMMORTAL_JELLYFISH = 2, }; struct RawData_t { int age; AnimalType_t typeOfAnimal; }; RawData_t GetMyCurrentRawData();//returns the current raw data bool IsDataReady(); //returns true if data is ready, false otherwise
class Animal { public: virtual Animal(); virtual ~Animal(); int GetType() { return rawAttributes.typeOfAnimal; }; //the only implementation for all children virtual int GetAge() { return rawAttributes.age; }; //to be implemented in the child class virtual void UpdateAge() { rawAttributes.age++; }; //to be implemented in the child class virtual int GetNumberOfLegs() = 0; //to be implemented in the child class private: RawData_t rawAttributes; }
class Dog : public Animal { public: Dog(RawData rawData):Animal(rawData){}; int GetNumberOfLegs() {return 4;}; }; class GreyHound : public Dog { public: GreyHound(RawData rawData):Dog(rawData){}; }; class ImmortalJellyFish : public Animal { public: ImmortalJellyFish(RawData rawData):Animal(rawData){}; int GetNumberOfLegs() {return 0;}; void UpdateAge() { return;} override; };
class Building { public: Building(){}; //sorry for the long line, but you get the idea... int Display(void){if(IsDataReady()) DisplayOnScreen("This animal ( "+ animal_m.GetType()+") has " + animal_m.GetNumberOfLegs() + "legs and is " + animal_m.GetAge() + " years old\n";}; int Live(void){currentDiagCode_m.UpdateAge();}; private: auto animal_m; //?? not working }; static Building paddock; static Building farm; void Buildings_Step(void) { paddock.Live(); paddock.Display(); farm.Live(); farm.Display(); }
我在这里苦苦挣扎:
这是我的限制条件
我虽然是关于:
有没有可以满足我需求的设计/模型?
谢谢!
答案 0 :(得分:2)
在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
。这在概念上相似,但是在实现方式上有所不同。从概念上讲,这是相似的原因是因为您有一组有限的类型,所以您实际上并不需要多态来在运行时处理任意,未知派生类型。