2013-05-07 4 views
0

Я написал код для динамического выделения имени. Я знаю, что я должен позаботиться о глубокой копии в таких сценариях. То, что я написал, это моя собственная версия Copy Constructor, Copy Assignment Operator и destructor. Должен ли я переопределить любые другие неявные функции, такие как Move Assignment Operator. Я не совсем понимаю концепцию оператора присваивания перемещения или любых других неявно определенных функций-членов (кроме тех, которые я уже упомянул). Можно ли добавить код для этого dynName code, чтобы показать оператор перемещения назначения или любую другую неявную функцию-член (если есть).Оператор присваивания для объекта

#include <iostream> 

using namespace std; 

class dynName{ 
    char* name; 
    int size; 
    public: 

    dynName(char* name="") 
    { 
     int n=strlen(name)+1; 
     this->name= new char[n]; 
     strncpy(this->name,name,n); 
     size=n; 
     name[size-1]='\0';//NULL terminated 
     cout << "Object created (Constructor) with name : " 
     << name << " at address " << &(this->name) << endl; 
     } 

    dynName(const dynName& Ob)//Copy Constructor 
    { 
     int n=Ob.size; 
     this->name= new char[n]; 
     strncpy(this->name,Ob.name,n); 
     size=n; 
     cout << "Object created(Copy constructor) with name : " 
     << this->name << " at address " << &(this->name) << endl; 
     } 

    //Assignment Operator 
    dynName& operator=(const dynName& ob); 

    ~dynName() 
    { 
     cout << "Object with name " << this->name << " at address " << 
     &(this->name)<<" destroyed" << endl; 
     delete[] name; 
     name=0; //Avoiding Dangling pointer if any 
     } 
    //friend ostream& operator << (ostream& os,const dynName ob); 
    //Will Call Copy Constructor 

    friend ostream& operator << (ostream& os,const dynName& ob); 
    }; 

dynName& dynName::operator=(const dynName& ob) 
{ 
    // check for self-assignment 
     if (this == &ob) 
     cout << "Created with assignment Operator " << endl; 
      return *this; 

     // first we need to deallocate any value that this string is holding! 
     delete[] this->name; 


     this->size = ob.size; 

      // this->name = new char[this->size]; 
      strncpy(this->name, ob.name,this->size); 
      cout << "Created with assignment Operator " << endl; 

    return *this; 
    } 

//ostream& operator << (ostream& os,const dynName ob) 
ostream& operator << (ostream& os,const dynName& ob) 
{ 
    os << "The name ("<< ob.size << " Letters) : " << ob.name << endl; 
    return os; 
    } 

int main() 
{ 

    dynName Ob1("Andrew Thomas"); 
    dynName Ob2; 
    dynName Ob3(Ob1); 
    dynName Ob4; 
    Ob4=Ob1;//Should Call Assignment Operator 
    cout << "\n\n\n"; 
    cout << Ob1; 
    cout << Ob2; 
    cout << Ob3; 
    cout << Ob4; 
    cout << "\n\n\n"; 

    return 0; 
    } 

Проблема с этим кодом является то, что он не называя моего оператора присваивания копии .any помощь, почему так?

$ ./Trial

Object created (Constructor) with name : Andrew Thomas at address 0x22ac40 
Object created (Constructor) with name : at address 0x22ac30 
Object created(Copy constructor) with name : Andrew Thomas at address 0x22ac20 
Object created (Constructor) with name : at address 0x22ac10 



The name (14 Letters) : Andrew Thomas 
The name (1 Letters) : 
The name (14 Letters) : Andrew Thomas 
The name (1 Letters) : 



Object with name at address 0x22ac10 destroyed 
Object with name Andrew Thomas at address 0x22ac20 destroyed 
Object with name at address 0x22ac30 destroyed 
Object with name Andrew Thomas at address 0x22ac40 destroyed 

Благодаря

EDIT

Ссылаясь на Move assignment operator and `if (this != &rhs)` Что такое Class&&? Я имею в виду, я никогда не использовал что-то в этом роде .. Просто ссылки т.е. Class&

+0

Код, который вы отправили для меня. – jrok

+3

Не изобретайте еще один сломанный класс строк, используйте поле std :: string и позвольте ему иметь дело с управлением памятью. –

+0

Я удалил «динамическое» слово из вашего названия, поскольку здесь это не имеет значения. В вашем 'int main' все объекты ObX' ** не являются динамическими **. Их внутреннее содержание есть, но объектов нет. – quetzalcoatl

ответ

5

кажется вам не хватает брекеты здесь:

if (this == &ob) 
    cout << "Created with assignment Operator " << endl; 
     return *this; 

Только выход является частью if тела, return заявление будет всегда выполняться.

4

Он должен быть вызван оператором копирования, но вы всегда возвращаетесь после проверки самонаведения.

dynName& dynName::operator=(const dynName& ob) 
{ 
    // check for self-assignment 
     if (this == &ob) 
     cout << "Created with assignment Operator " << endl; 
      return *this; //THIS LINE is not in the if block 

     // first we need to deallocate any value that this string is holding! 
     delete[] this->name; 


     this->size = ob.size; 

      // this->name = new char[this->size]; 
      strncpy(this->name, ob.name,this->size); 
      cout << "Created with assignment Operator " << endl; 

    return *this; 
    } 
+0

Комментарий, введенный в код, легко упускается из виду.Вы бы это разработали в тексте ответа. – quetzalcoatl

Смежные вопросы