1

我正在课堂上学习 C++,并且正在尝试使用虚拟创建/克隆函数返回指向派生对象的指针。

我找到了这个实现,并即将围绕它构建http://www.cs.uregina.ca/Links/class-info/210/C++FAQ/virtual-functions.html#[20.5]

我不明白的是,在 clone() 或 create() 退出它们的块之后,返回的指针实际上是如何指向任何相关数据的?

有没有更好的方法,或者我需要为每个案例编写一个函数?

非常感谢

class Shape {
 public:
   virtual ~Shape() { }                 // A virtual destructor
   virtual void draw() = 0;             // A pure virtual function
   virtual void move() = 0;
   // ...
   virtual Shape* clone()  const = 0;   // Uses the copy constructor
   virtual Shape* create() const = 0;   // Uses the default constructor
 };

 class Circle : public Shape {
 public:
   Circle* clone()  const { return new Circle(*this); }
   Circle* create() const { return new Circle();      }
   // ...
 };
4

2 回答 2

1

...在 clone() 或 create() 退出其块后,返回的指针如何实际指向任何相关数据?

运算符new动态分配内存。该内存在使用delete. 既不也不clone()create()删除”这些指针,因此这两个函数都返回一个有效指针。

有没有更好的方法,或者我需要为每个案例编写一个函数?

由于这里使用了多态性,假设用户使用Shape类并且不知道这些对象的实际实现(即他们只使用“接口”)。如果不知道实际的实现是什么,就不可能既不创建也不复制对象。

唯一知道类型的地方是实现接口的类的方法内部(在您的情况下是Circle)。因此,这是您基本上知道类型、大小以及创建和/或复制对象所需的所有其他必要信息的唯一地方。所以答案基本上是肯定的,你必须create()clone()每个继承Shape. 否则,将无法创建/克隆对象,或者更糟 - 您可能会遇到对象切片问题。

创建一个静态对象是一种可行的解决方法,还是否定所有工作都是面向对象的?

我看不出在这里创建静态对象有什么帮助。静态对象通常每个范围存在一个实例。create()拥有and的全部目的clone()是能够创建对象的多个实例(默认或现有实例之一的副本)。因此,拥有一个静态实例将无助于实现代码应该做的事情。

于 2013-06-02T00:22:04.350 回答
1

Clone() 的使用方式与往常一样。Create() 不是真的。当你通过虚拟调度使用它时,你能展示一个用例吗?

我经常使用的是静态成员 Create()。这就像工厂方法一样。每个类都在一个映射中注册,带有一些 ID 和指向这个 Create 函数的指针。然后可用于创建仅知道 ID 的适当对象(例如从文件中读取),然后在新实例上调用虚拟函数(即反序列化文件中的内容)。

为了避免复制粘贴,我使用了一个宏来声明和实现所有必需的功能。

于 2013-06-02T00:34:16.907 回答