假设我有一个名为MyClass
的类,它有两个成员变量(均为int
),称为firstNumber_
和secondNumber_
。这个类还有一个名为clone( )
的方法,它创建一个具有相同值的对象的新实例,并返回该新实例。
问题是,当返回类的新实例时,我是将它作为指针,引用还是实例本身返回?
// MyClass.h
class MyClass {
private:
int firstNumber_;
int secondNumber_;
public:
MyClass( int numA, int numB ) {
firstNumber_ = numA;
secondNumber_ = numB;
}
~MyClass( ) { };
// This method creates a copy of the object and returns that object.
// The ( ? ) is there because I am not sure what type the returned value is.
MyClass ( ? ) clone( ) {
// Do I just return the new instance? Or do I need to return a reference or a pointer of the new instance?
return MyClass( firstNumber_, secondNumber_ );
}
};
实现这一目标的正确方法是什么?请注意,MyClass
不会从任何其他类继承。
提前致谢。
答案 0 :(得分:3)
方法clone()
通常用于返回指向多态类型实例的指针,因此您可以在基类型的指针上调用它,并获取指向右派生类型实例的指针。对于简单复制,在C ++中使用复制构造函数,而不是克隆方法。
克隆方法:
struct Base{};
struct Foo : Base
{
Base* clone() const { return new Foo(*this); }
}:
Base * b1 = new Foo;
...
Base * b2 = b1->clone(); // points to a Foo instance, copy of object pointed at by b1
clone
方法使用(编译器生成的)复制构造函数。
使用复制构造函数:
Foo f1;
Foo f2 = f1; // copy assignment
在实际代码中,您应该更喜欢这些示例中使用的原始智能指针。
关于返回值,默认情况下应该按值返回,但在多态clone()
示例中,这会通过将返回对象切换为Base
来破坏目的。所以我们返回一个指向动态分配的实例的指针。意图和所有权必须明确:在这种情况下,调用者拥有指针,并负责解除分配。 Pre-c ++ 11你必须依靠文档来传达这一点。在C ++ 11中,您可以使用智能指针std::unique_ptr
,它强制执行所有权并清楚地说明它。