gpt4 book ai didi

C++ 多态加载/保存

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:42 25 4
gpt4 key购买 nike

我正在保存一堆不同的对象并将它们重新加载到一个文件中,这些对象都是从一个公共(public)基础派生的,显然我需要存储类名(或类似的东西)以便在重新加载时创建正确的对象类型。

保存很容易:

class Base 
{
virtual string className() const = 0;

void saveToFile()
{
write(className());
... other writing stuff
}
}

class Derived1: public Base
{
string className() const { return "Derived1"; };
...
}

class Derived2: public Base
{
string className() const { return "Derived2"; };
...
}

而且,如果您不介意复制字符串,加载很容易...

static Base * Base::factory(const String &cname)
{
if (cname == "Derived1")
return new Derived1;
else if (cname == "Derived2")
return = new Derived2;
else ...
}

void load()
{
String cname = readString();

Base * obj(Base::factory(cname);

obj->readIt();
}

但是,重复的字符串冒犯了我的 DRY 感觉:理想情况下,className() 可以是 static virtual,但这是不允许的。我有一种感觉,我错过了一个明显的“干净”方法,但我还看不到。有什么建议吗?

注意:好的,使用工厂方法稍微调整了代码。请注意,这实际上并不能解决问题!

注意#2:上面的代码并没有试图成为最终工厂模式的完美代表。我不关心基类和派生类之间不需要的链接,也不关心扩展层次结构的潜在困难。我正在寻找能够简化代码而不是使其复杂化的答案。

最佳答案

这大概是你能做的最好的事情了,你可以通过将 if 包装在工厂类中来稍微清理一下。

关于C++ 多态加载/保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com