operator overloading 保存未參與運算項目

如何保存 C++ operator overloading 未參與運算項目的原始值

以下程式 重置運算子 '+' 改為可做座標值加法運算,

Class Position 變數有 px, py and name

執行 PosC = PosA + PosB; 後 "PosC" 名稱變成 "null"

請問應該如何寫才能保存 PosC" 的名稱?

#include <iostream>

using namespace std;

char *null = "null";

struct Position

{

Position(int x, int y) : px(x), py(y) { name = null; };

Position(int x, int y, char *n) : px(x), py(y), name(n) {};

Position operator+(Position &other);

void Display() { cout << name << ": " << px << ", " << py << endl; }

private:

int px, py;

char *name;

};

Position Position::operator+(Position &other)

{

return Position(px+other.px, py+other.py);

}

void main()

{

Position PosA = Position(22, 222, "PosA");

Position PosB = Position(33, 333, "PosB");

Position PosC = Position(44, 444, "PosC");

PosA.Display();

PosB.Display();

PosC.Display();

cout << "-> PosC = PosA + PosB\n";

PosC = PosA + PosB;

PosC.Display();

system("pause");

}

執行結果 "PosC" 名稱變成 "null"

PosA: 22, 222

PosB: 33, 333

PosC: 44, 444

-> PosC = PosA + PosB

null: 55, 555

2 Answers

Rating
  • sponge
    Lv 6
    1 decade ago
    Favorite Answer

    您的operator+中回傳Position(px+other.px, py+other.py)

    回傳後必須使用operator=把回傳值設給PosC

    但是您用這建構子建立的物件

    它的name成員被設為null

    要解決這個的辦法,必須自己定義operator=

    Position& operator=(const Position &other)

    {

    px=other.px, py=other.py;

    return *this;

    }

    operator=內第一個指另就是把座標複製過去

    但是裡面並未涉及name成員的複製(name=other.name)

    因此可保留PosC的name原值

    另外若您有以下敘述:

    Position PosD=PosA+PosB;

    它會呼叫預設的複製建構子

    因為您也一樣未定義

    因此把Position(px+other.px, py+other.py)直接複製到PosD

    PosD就變成相加結果但PosD.name是null

    這個也許對您來說不成問題

    因為這種寫法本來就是沒指定name

    只是稍微提一下

    另外operator+建議改成

    Position operator+(const Position &other) const

    {

    ...

    }

    參數const是因為沒有在裡面改變它的值

    否則出現PosD=PosA+PosB+PosC錯誤就讓您收拾不完

    後面const是因為未在裡面改變*this的值

    否則若PosA宣告成固定座標(const Position PosA)

    就無法使用operator+

    以上回答希望對您有幫助!

  • SiYu
    Lv 5
    1 decade ago

    缺少copy construct

    跟 operator=

Still have questions? Get your answers by asking now.