1

假设我有一个名为 的类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它不会从任何其他类继承。

提前致谢。

4

1 回答 1

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. 所以我们返回一个指向动态分配实例的指针。意图和所有权必须明确:在这种情况下,调用者拥有指针,并负责释放它。在 c++11 之前,您必须依靠文档来传达这一点。在 C++11 中,您可以使用智能指针std::unique_ptr,它强制执行所有权并清楚地说明它。

于 2012-10-18T05:47:22.507 回答