我的程序是一个可以存储产品对象的Store对象,从中继承了两个新对象:Donuts和Coffee。
我的Store.save()函数以文本表示形式保存商店的所有数据,如下所示:
2 // # of products in the store Chocolate Glazed // # product name (this is a donut) 3 // # price 1 // # cost chocolate // # frosting (inherited from Donut object) Mocha // # product name (this is coffee) 4 // # price 1 // # cost 2 // # darkness (inherited from Coffee object)
如您所见,从文件读入时,我很难获得加载功能来区分甜甜圈和咖啡。我的加载函数构造了一个像这样的商店:
std::ifstream ifs{"untitled.dat"}; if (ifs) _store = Store{ifs};
...构造函数看起来像...
Store::Store(std::istream& ist) { std::getline(ist, _name); int products; ist >> products; ist.ignore(); while(products-- > 0) { Product* product = new Product{ist}; this->add_product(product); }
我有一个Product构造函数,从中继承了Donut和Coffee构造函数,分别如下所示:
Product::Product(std::istream& ist) { std::getline(ist, _name); ist >> _price; ist.ignore(); ist >> _cost; ist.ignore(); } ______________________________________________________________ Donut::Donut(std::istream& ist) : Product{ist} { ist >> _frosting; ist.ignore(); } ______________________________________________________________ Java::Java(std::istream& ist) : Product{ist} { //ist >> _darkness; ist.ignore(); }
我以为会使用Donut和Coffee构造函数,但是后来我意识到该函数无法分辨正在读取的产品类型,因为它只是文本。我将如何解决这个问题?唯一的要求是,我的加载功能必须使用ifstream构造函数构造一个商店。任何反馈将不胜感激!
答案 0 :(得分:3)
您描述的问题是Factory Method Pattern存在的原因之一!
您可以尝试这样的事情:
void Donut::save(std::ostream& ost) {
ost << "Donut" << "\n";
Product::save(ost);
ost << _frosting << '\n' << _sprinkles << '\n' << _filling << '\n';
}
然后,您可以在读取函数中添加while
循环:
while(products-- > 0)
{
std::getline(ist, type);
if(type == "Donut")
{
Donut* donut = new Donut{ist};
this->add_product(donut);
}
if(type == "Java")
{
Java* java = new Java{ist};
this->add_product(java);
}
}