从文件中读取并构造继承的对象

时间:2019-04-18 17:58:00

标签: c++

我的程序是一个可以存储产品对象的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构造函数构造一个商店。任何反馈将不胜感激!

1 个答案:

答案 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);
    }
}