2016-09-12 9 views
-1

同じクラスの2つの変数を追加する方法については複数の例がありますが、異なるクラスの変数をオーバーロードで追加する方法の例は見つかりません。演算子のオーバーロード+ C++

私の問題に関連するテンプレートはまだ使用していませんが、私たちはそれを使用することはできません。

私はクラスの人に+演算子を追加したいと考えています。 ex。 Person p;本b; p + b; // p.addBook(b)のような関数を使っていた場合と同じように本を追加します。

class Person 
{ 
    private: 
     B * b; 
     string sName; 
     int numOfBook; 
     int maxNumOfBooks; 

maxNumOfBooks人が "" に

public: 
     Person(); 
     Person(const Person&); 
     ~Person(); 
     const Person operator = (const Person &) 
     void addBook(const Book &); //adds a book to a Person 
     Person operator+(Person); 
     Book getBook(){return b[numOfBook];}//returns index of book 
}; 

Person::Person() 
{ 
    numOfBook = 0; 
    maxNumOfBooks = 10; 
    b = new B[maxNumOfBooks]; 
    for(int x=0;x<maxNumOfBooks;x++) 
    { 

セット名を運ぶために許可されていることを最大です。私はこれをオーバーロードした。

 b[x] = ""; 
    } 
} 

Person::Person(const Person& p) 
{ 
    numOfBook = p.numOfBook; 
    maxNumOfBooks = p.maxNumOfBooks; 
    b = new B[maxNumOfBooks]; 
    for(int x=0;x<maxNumOfBooks;x++) 
    { 
     b[x] = p.b[x]; 
    } 
} 
Person::~Person() 
{ 
    delete [] b; 
} 

void Person::addBook() 
{ 

置き換え "" numOfBooks場合< maxNumOfBooks。

これをコードしました。

} 

Person Person::operator+(Person obj) 
{ 

ここで何をすべきかわからない。しかし、私はそれがこのようなものに見えなければならないと仮定しています。

Spell a; 
    ++numOfBook; 
    a=this->getBook(numOfBook); 
    obj.addBook(a); 
    return *this; 
} 

const Person Person::operator = (const Person & obj) 
{ 
     delete [] b; 
    numOfBook = p.numOfBook; 
    maxNumOfBooks = p.maxNumOfBooks; 
    b = new B[maxNumOfBooks]; 
    for(int x=0;x<maxNumOfBooks;x++) 
    { 
     b[x] = p.b[x]; 
    } 
    return *this; 

} 

class Book 
{ 
    private: 
     string name; 
     int price; 
    public: 
     void setP(); 
     int getP(); 
}; 


int main() 
{ 
    Person s; 
    Book bk("Story", 18); 

    s+bk; 

私はPersonに本を追加したいと思いますが、addBook()関数も使用する必要があります。

} 
+0

あなたは値によって 'Person'オブジェクトを返しています。では、 'Person'オブジェクトの代入演算子とコピーコンストラクタはどこにありますか?これらの2つの関数は '演算子+'が正しく動作するために必須であり、あなたはそれらを書くことを完全に逃しました。 [3のルール](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)を参照してください。 – PaulMcKenzie

+0

@PaulMcKenzie、私の質問に必要な場合は追加できます。それは私の元のコードです。 – ArcheAngel

+1

'operator +'が正しく動作するためには今必要な機能を今すぐ追加することにしましたか?これらの機能は、元のポストにあってはならず、補足としてではありませんでした。 – PaulMcKenzie

答えて

1

あなたが+演算子をオーバーロードするとき、あなたは戻り値の型(多くの場合、これは2つの入力と出力は同じ型で、算術式のためにオーバーロードされているが、それは全く必要ありません)の新しいインスタンスを返します。

オペレータが何をすべきかを把握するだけでいいです。 この場合、+オペレータは、onという名前のpersonオブジェクトのコピーに書籍を追加する必要があります(つまり、新しいインスタンスを返し、オリジナルを変更しない)。

Person Person::operator + (const Book& b){ 
    Person tmp(*this); //create a copy of this Person to modify 
    tmp.addBook(b); //modify this new copy and not the original 
    return tmp;  //return the modified copy 
} 

+=オペレータが現在のオブジェクトを変更し、あなたはすでに+=は、あなたがあなたの+オペレータを変更することができます定義されている場合は、参照

Person& Person::operator += (const Book& b){ 
    addBook(b); 
    return *this; 
} 

を返します。一方:

Person Person::operator + (const Book& b){ 
    return Person(*this) += b; 
} 

注:

Person P; 
Book B; 
P + B; // P is not modified; 

にequivalantされていません。以下は、しかし

Person P; 
Book B; 
P.addBook(B); // P is modified 

Person P; 
Book B; 
P += B; // P is modified 

と同様に

Person P; 
Book B; 
P = P + B; // P is modified because it is assigned (P + B) 
+0

また、 'operator + ='があると、 'operator +'は単純に 'return Person(* this)+ = b;' – PaulMcKenzie

+0

GoodParkです。 –

+0

@Timothy Murphy、私はそれを見てコーディングを開始していただきありがとうございます。私も思っていなかったので、必要なコードを追加しないことをお詫びします。私はすべての必須コードを追加したことを確認せずにすばやく投稿しました。 – ArcheAngel

関連する問題