新类型(抽象类)
Posted
技术标签:
【中文标题】新类型(抽象类)【英文标题】:new typeof(abstract class) 【发布时间】:2018-01-27 20:49:06 【问题描述】:我有抽象类 Item 和 Item 的一些子多态类,例如:Sword、Axe 等。
是否可以在 c++ 中执行以下操作:
Item* firstVariable = new Sword();
Item* secondVariable = new typeof(firstVariable);
当我这样做时,我得到一个错误,即 Item 是一个抽象类。 你知道如何解决这个问题吗?
【问题讨论】:
实现虚拟克隆功能。而且很难看出你是如何得到你所说的错误的,因为 C++ 没有 typeof 运算符。 @NeilButterworthtypeof
是早于decltype
的 gcc 语言扩展,也适用于 C 模式。如果没有给出“-std=”(或“-ansi”)参数,则它可用。
【参考方案1】:
为了解释 Neil 的评论,下面是基本的克隆成语或虚拟复制成语的样子:
class Item
public:
virtual ~Item() = 0;
virtual Item* clone() const = 0;
protected:
Item(const Item&) = default;
Item(Item&&) = default;
Item& operator=(const Item&) = default;
Item& operator=(Item&&) = default;
;
Item::~Item() = default;
class Sword : public Item
public:
virtual Item* clone() const override
return new Sword(*this);
;
class Axe : public Item
public:
virtual Item* clone() const override
return new Axe(*this);
;
int main()
Item* firstVariable = new Sword();
Item* secondVariable = firstVariable->clone();
delete firstVariable;
delete secondVariable;
但是,我建议几乎不要使用new
和delete
,因为它们很容易犯错误,导致指针悬空、重复删除、内存泄漏、异常不友好的代码等等。这是一个更安全的解决方案:
#include <memory>
class Item
public:
virtual ~Item() = 0;
virtual std::unique_ptr<Item> clone() const = 0;
protected:
Item(const Item&) = default;
Item(Item&&) = default;
Item& operator=(const Item&) = default;
Item& operator=(Item&&) = default;
;
Item::~Item() = default;
class Sword : public Item
public:
virtual std::unique_ptr<Item> clone() const override
return std::make_unique<Sword>(*this);
;
class Axe: public Item
public:
virtual std::unique_ptr<Item> clone() const override
return std::make_unique<Axe>(*this);
;
int main()
std::unique_ptr<Item> firstVariable = std::make_unique<Sword>();
std::unique_ptr<Item> secondVariable = firstVariable->clone();
【讨论】:
以上是关于新类型(抽象类)的主要内容,如果未能解决你的问题,请参考以下文章