0

コピーコンストラクターの書き方がわかりません...

これは私のコンストラクタです:

public:
Person(const char * aName, const char * userID, const char * domain, Date aDate) {
//This constructor should create heap objects

    name = new char[strlen(aName) + 1]; 
    strcpy (name, aName);
    emailAddress = new EmailAddress(userID, domain); 
    birthday = new Date(aDate); 

    cout << "\nPerson(...) CREATING: ";
    printOn(cout);
}

これは、コピーコンストラクターに対して私がやろうとしていることです:

Person(const Person & p){
    name = new char[strlen(p.name)+1];
    strcpy(name, p.name);
    emailAddress = new EmailAddress(*p.emailAddress);
    birthday = new Date(*p.date);

    cout << "\nPerson(const Person &) CREATING: ";
    printOn(cout);
}

コピー コンストラクターで新しい Date と新しい EmailAddress に何を渡せばよいかわからないため、現在行っていることはまったく機能していません。

これは適切な代入演算子です (ここでも date と emailAddress に何を渡せばよいかわかりません...):

Person & operator=(const Person & p) {
        if(&p != this) {
           delete [] name;
           delete emailAddress;
           delete birthday;
           name = new char[strlen(p.name) + 1];
           strcpy (name, p.name);
               emailAddress = new EmailAddress();
               birthday = new Date();
        }
        return *this;
    }

どんな助けでも大歓迎です!

編集:

日付の定義

class Date{ //this class is complete
//This class represents a date

public:
      Date(int aDay, int aMonth, int aYear) : day(aDay), month(aMonth), year(aYear) {} 
      Date(const Date & aDate) :  day(aDate.day), month(aDate.month), year(aDate.year)     {};
      void printOn(ostream & out) const {out << day <<"/" << month << "/" << year;}    
4

2 に答える 2

4

良いアドバイスなので、JimR のコメントを回答に分割します。可能であれば、C 型ではなく C++ 型を使用してください。また、可能であればポインタを避けてください。

C++ 型の使用

たとえば、あなたのクラスは、私たちが見る限り、次のようになります。

class Person {
    char *name;
    Email *emailAddress;
    Date *birthday;
};

Dateとが十分に軽量である場合Email(そしてそうあるべきです)、それらをオブジェクト自体の値として保持します。また、次のようnameにしstd::stringます。

class Person {
    std::string name;
    Email emailAddress;
    Date birthday;
};

コンストラクターは非常に簡単になります。

Person::Person(const std::string &aName, const std::string &userID, const std::string &domain, Date aDate) :
    name(aName),
    emailAddress(userID, domain),
    birthday(aDate)
{ }

さらに良いことに、C++ が作成するデフォルトのコピー コンストラクターが機能するようになりました。デストラクタ代入演算子も同様です。無料で。さらに良いことに、これらはすべて例外セーフになりました。何らかの理由で例外が発生した場合、すべてがクリーンアップされます。

于 2013-10-22T01:05:10.343 に答える
0

うまくいきました - 助けてくれてありがとう!*p.emailAddress と *p.birthday を渡す必要がありました

Person(const Person & p){
    name = new char[strlen(p.name)+1];
    strcpy(name, p.name);
    emailAddress = new EmailAddress(*p.emailAddress);
    birthday = new Date(*p.birthday);

    cout << "Person(const & Person)... CREATING: ";
    printOn(cout); 
}

Person & operator=(const Person & p) {
        if(&p != this) {
           delete [] name;
           delete emailAddress;
           delete birthday;
           name = new char[strlen(p.name) + 1];
           strcpy (name, p.name);
           emailAddress = new EmailAddress(*p.emailAddress);
           birthday = new Date(*p.birthday);
        }
        return *this;
    }
于 2013-10-22T00:41:05.793 に答える