所以我有一个基类Furniture,它也是一个抽象类,派生类Bed,Table,Chair和Desk。我正在使用指向基类Furniture的指针向量,并且在那里我保存派生类的实例。我有另一个类收银机,它使用家具载体进行操作。我必须使用我所创建的派生类的复制构造函数,并且使用这段代码的想法是为了克隆派生类对象,该对象保存在基类中的指针向量中,以最安全的方式可能。 所以这些是我的副本构造函数:
explicit Desk(const Desk& _desk) : Furniture(_desk), numberOfDrawers(_desk.numberOfDrawers) {};
explicit Table(const Table& _table) : Furniture(_table), numberOfLegs(_table.numberOfLegs) {};
explicit Chair(const Chair& _chair) : Furniture(_chair), numberOfLegs(_chair.numberOfLegs) {};
explicit Bed(const Bed& _bed) : Furniture(_bed), size(_bed.size) {};
到目前为止我想到的方式是:
std::cout << "The object is found: " << furniture[index]->getName() << std::endl;
std::cout << "Price: " << furniture[index]->getPrice() << std::endl;
std::cout << "Code: " << furniture[index]->getCode() << std::endl;
std::cout << "Do you want to copy the purchase of " << furniture[index]->getName() << " ? (Y/N)";
char read;
std::cin >> read;
if (read == 'Y')
{
if (furniture[index]->getName() == "Bed") {
Bed* deskClone = new Bed(dynamic_cast<Bed&>(*furniture[index]));
furniture.push_back(deskClone);
}
if (furniture[index]->getName() == "Desk") {
Desk* bedClone = new Desk(dynamic_cast<Desk&>(*furniture[index]));
furniture.push_back(bedClone);
}
if (furniture[index]->getName() == "Table") {
Table* tableClone = new Table(dynamic_cast<Table&>(*furniture[index]));
furniture.push_back(tableClone);
}
if (furniture[index]->getName() == "Chair") {
Chair* chairClone = new Chair(dynamic_cast<Chair&>(*furniture[index]));
furniture.push_back(chairClone);
}
}
不幸的是,我读到这很危险,所以我想问一下是否有更好的方法来解决这个问题? 顺便说一句:这是我的第一篇帖子,不太吝啬:D
答案 0 :(得分:0)
将纯虚拟克隆功能添加到基类,覆盖所有地方,并用
替换整个条件汤mvn clean package
答案 1 :(得分:0)
正如评论中所建议的那样,在基类中创建一个虚函数
virtual Furniture* copy() = 0;
孩子们实施的
class Bed
{
...
virtual Furniture* copy() override
{
return new Bed(*this);
}
...
};