2017-11-23 20 views
0

2つのオペランドに影響を与えずに構造体のプラス演算子をオーバーロードしたいとします。オペランドのオーバーロード演算子+オペランドに影響を与えずに

ここに私が行ったことがあります。

struct Board { 
    int m_len; 
    int blk[BLK_MAX][BLK_MAX]; 
}; 

Board& operator+(const Board& b1, const Board& b2) { 
    Board ret; 
    for (int y = 0; y < N; y++) { 
     for (int x = 0; x < N; x++) { 
      ret.blk[y][x] = b1.blk[y][x] + b2.blk[y][x]; 
     } 
    } 
    return ret; 
} 

しかし、オペレータがローカル変数を返すのでうまくいかないかもしれません。これがメモリ破壊を引き起こすかどうかはわかりません。これを行うより良い方法はありますか?

+4

ただ、 '&'を削除し、値によって構造体を返します。 – Detonar

+2

そして広範なコピーで答えが慌ててパニックになる前に、C++は何年もNRVOを実装していることを知っています。今日の標準では、それがどのように振る舞うべきかを記述しています。実装が常にそれを実行するよう強制するものではありませんが、実際には実際に行うことが実際に法律です。 – StoryTeller

+1

@Peter Hwangマジック変数Nとは何ですか?そしてなぜ他の魔法の変数 - データメンバm_lenも設定されていないのですか? –

答えて

2

これを行うより良い方法はありますか?

確かにあり、非常に簡単です。加算は新しいの値を計算します。したがって(やない参照)を返す必要があります:

Board operator+(const Board& b1, const Board& b2) { 
    Board ret; 
    for (int y = 0; y < N; y++) { 
     for (int x = 0; x < N; x++) { 
      ret.blk[y][x] = b1.blk[y][x] + b2.blk[y][x]; 
     } 
    } 
    return ret; 
} 
+0

戻り値が他の値によって壊れている可能性はありますか?私はまだローカル変数 "ret"がスコープの外に出ているので疑いがあります。 –

+2

@PeterHwang - 'int'を値で返すときも同じ心配はありますか? – StoryTeller

+1

@PeterHwangそうではありませんが、 'operator +'が終了したときにコピーが作成されたようにすべてが起こります。 – YSC

2

あなたが参照することにより、ローカル変数を返すべきではありません。

あなただけ交換する必要があります。

Board& operator+(const Board& b1, const Board& b2) 

をによって:

Board operator+(const Board& b1, const Board& b2) 
関連する問題