2017-04-06 103 views
-1

我正在尝试编写Shape类的拷贝构造函数,以便它打印出名称为s2的地址。如何在C++中创建拷贝构造函数

这里是我的代码:

class Shape { 
private: 
    int x; 
    int y; 
    string * name; 

public: 
    //constructor 
    Shape() { 
     cout << "Inside the constructor" << endl; 

    } 

    //Copy constructor 
    Shape(Shape& source) { 
     cout << "Copy constructor called" << endl; 

     name = new string[name]; 

     copy(source.name, source.name, this->getName); 
    } 


    //Destructor 
    ~Shape() {} 

    void setX(int px) { 
     x = px; 
    } 
    void setY(int py) { 
     y = py; 
    } 

    void setName(string * str) { 
     name = str; 
    } 
    string * getName() { 
     return name; 
    } 


int main() 
{ 
    Shape s1; 
    s1.setName(new string("first shape")); 

    Shape s2(s1); 
    cout << s1.getName() << endl; //will display the address of name for s1 
    cout << s2.getName() << endl; //will display the address of name for s2 
    return 0; 
} 
+0

'name = new string [name];'这是应该做什么的?你根本不需要分配srring的堆,使用'string name;'。你不需要复制构造函数或析构函数。 –

回答

0

正如你所创建的字符串指针成员names1和你它调用拷贝构造函数时只是复制到s2,这只是预期的行为,它显示的与s1相同的地址 - 它只是复制指针。

如果您想为每个形状创建一个唯一的名称,只需创建一个静态方法/自由函数来创建一个新名称,然后在构造函数和复制构造函数中调用该函数,为每个新实例指定一个唯一的名称。

为了什么是值得的,在这里使用new运算符并不常见(您是否来自Java背景?) - 您可能只想使用常规的std::string,在这种情况下,您不必执行内存管理(您的代码现在基本上有内存泄漏,因为您不需要拨打delete任何地方以释放通过new分配的内存)。

PS:刚刚看到您刚编辑并更改您的代码,而我正在输入我的答案......我不会追踪这些变化(请原谅),但我留下我的答案在这里,它的价值。

0

请问您可以尝试下面的代码吗?

//Copy constructor 
    Shape(Shape& source) { 
     cout << "Copy constructor called" << endl; 
     name = new string[name]; 
     *name = *source.name; 
    }