0

名前を動的に割り当てるためのコードを作成しました。このようなシナリオでは、ディープ コピーを処理する必要があることはわかっています。私が書いたのは、コピー コンストラクタ、コピー代入演算子、およびデストラクタの独自のバージョンです。Move Assignment Operator などの他の暗黙的な関数を再定義する必要があります。Move 代入演算子またはその他の暗黙的に定義されたメンバー関数 (既に述べたもの以外) の概念については明確ではありません。Move代入演算子またはその他の暗黙的なメンバー関数(存在する場合)を表示するために、このコードを追加してください。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;
    }

このコードの問題は、コピー代入演算子を呼び出していないことです。

$ ./トライアル

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

ありがとう

編集

Move代入演算子と`if (this != &rhs)`を参照 とはClass&&?つまり、私はこの種のものを使用したことがないということです..ただの参照、すなわちClass&

4

2 に答える 2