我正在学习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(); }
// ...
};
答案 0 :(得分:1)
...在clone()或create()退出块之后,返回的指针实际上是如何指向任何相关数据的?
Operator new
动态分配内存。该内存有效,直到使用delete
免费使用。 clone()
或create()
都不删除“那些指针,因此这两个函数都返回一个有效的指针。
有没有更好的方法,或者我需要为每个案例编写一个函数?
由于此处使用了多态,因此假设用户使用Shape
类并且不知道这些对象的实际实现(即它们仅与“接口”一起使用)。在不知道实际实现是什么的情况下,既不能创建也不能复制对象。
唯一知道类型的地方是实现接口的类的内部方法(在您的情况下是Circle
)。因此,这是您基本知道创建和/或复制对象所需的类型,大小和所有其他必要信息的唯一位置。所以答案基本上是肯定的,你必须为每个继承create()
的顶级类实现clone()
和Shape
。否则,要么无法创建/克隆对象,要么更糟糕 - 您可能会遇到object slicing问题。
创建一个静态对象是一个可行的解决方法还是这样做会否定所有工作都是OO?
我不知道在这里创建静态对象有何帮助。静态对象通常每个范围存在一个实例。拥有create()
和clone()
的全部目的是能够创建对象的多个实例(默认或现有实例之一的副本)。因此,拥有一个静态实例将无助于实现代码应该执行的操作。
答案 1 :(得分:1)
Clone()完全按照惯例使用。 Create()不是真的。当你通过虚拟调度使用它时,你能展示一个用例吗?
我经常使用的是静态成员Create()。那是一种工厂方法。每个类都在一个映射中注册,其中包含一些ID和指向此Create函数的指针。然后可以用来创建适当的对象,只知道ID(比如从文件读取),然后在新实例上调用虚函数(即从文件中反序列化内容)。
为避免复制粘贴,我使用宏来声明并实现所有必需的函数。