1

私はオペレーター operloading の概念に非常に慣れておらず、以前に尋ねられた関連する質問は私よりもはるかに先を行っていたので、基本的な質問をする必要があります。

.h ファイルは次のとおりです。

#define ACCOUNT_H

using namespace std;

class Account{
  friend Account &operator+ (Account &acc);
  friend ostream &operator<< (ostream &, Account &);

  public:
    Account(double=100.0,double=0.0,double=0.0);

    Account &returnSum(Account &otherAccount) const;
    Account& operator+=(Account &Acc1);

    void setT(double);
    void setD(double);
    void setE(double);
    double getT(void);
    double getD(void);
    double getE(void);
    void printAccount();

  private:
    double t;
    double d;
    double e;
};

#endif

+「単一の引数を持つ」グローバル関数としてオーバーロードする必要があります (これはここで私にとって挑戦的な部分でした) および+=メンバー関数として (ここでは、メンバー関数であるため、右側のオペランドを取ることができないと仮定します。が問題の部分でした)。これが私の実装です+=

Account &Account ::operator+=(Account &Acc1){
   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;
   return *this;
}

+=これを修正して、オーバーロードの実装を書いていただければ幸いです+。t、d、e の値を Account オブジェクトとして追加するだけです。

4

2 に答える 2

6

operator+無料の機能として必要な場合は、次のものが必要です。

friend Account operator+ (const Account &acc, const Account &secondAcc);

また、operator +は二項演算子であるため、引数を 1 つだけ受け取ることはできません。メンバー関数の場合でも、最初のパラメーターthisがフードの下で渡されるだけで、2 つのパラメーターが必要です。

だから、あなたの2つのオプション:

1) 会員事業者

class Account{
    Account operator+ (const Account &acc);
};

2) フリーオペレーター

class Account{
    friend Account operator+ (const Account &acc, const Account &secondAcc);
};

Account operator+ (const Account &acc, const Account &secondAcc)
{
}

非常に重要 1 :

あなたのように参照するのではなく、値で返すことに注意してください。これは、参照によって返すのが違法なローカル変数を返す可能性があるため、UB を防ぐためです。

非常に重要 2 :

Account &Account ::operator+=(Account &Acc1){

   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;

   return *this;

}

このコードはリークします。自動ストレージ変数を使用しない理由:

Account &Account ::operator+=(Account &Acc1){
   Account result(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = result;
   return *this;
}

内部のロジックについてはまだわかりませんが、少なくともメモリリークはしていません。現在の方法では、呼び出すオブジェクトではなく、パラメーターを変更しています+=。したがって、たとえば、a+=ba同じままで、b変更されます。

于 2012-05-27T18:33:45.503 に答える
1
Account &Account ::operator+=(Account &Acc1){
   Account *result = new Account(Acc1.getT()+t,Acc1.getD()+d,Acc1.getE()+e);
   Acc1 = *result;
   return *this;
}

ここには 2 つの大きな問題があります。1つはルシアン・グリゴレが言及したリークです。もう 1 つは、これが operator+= の本来の動作とは異なる動作をすることです。問題は、あなたが変更していることですAcc1。を変更する必要がありますthis。次のコードは、オーバーロードで非常に奇妙な動作をします。

Account total;
Account joes_account;
...
total += joes_account;

あなたのコードではjoes_account、 variable ではなく sum で更新されますtotal

于 2012-05-27T19:16:29.343 に答える