おいおい、ちょっと待って!オペレーターまでOverloadできんの!?
全く知りませんでした。
頻繁にそういう自作のオペレーターで色々するのなら、役に立つのかな、、、
まあ、つべこべ考えずにまずはコード。
クラスのMember内でオーバーロード
sample.h
class Sample { public: char *str; private: // lowercaseに変える Sample operator-() const; // 文字列をくっつける Sample operator+(const Sample &rstr) const; // Constructor等は省略 }
sample.cpp
Sample Sample::operator-() const { char *buf = new char[ std::strlen(str) +1 ]; std::strcpy(buf, str); for (size_t i{0}; i < std::strlen(buf); i++) { buf[i] = std::tolower(buf[i]); Sample tmp {buf}; delete [] buf; return tmp; } Sample Sample::operator+(const Sample &rstr) const { char *buf = new char[ std::strlen(str) + std::strlen(rstr.str) +1 ]; std::strcpy(buf, str); std::strcat(buf, rstr.str); Sample tmp {buf}; delete [] buf; return tmp; }
main.cpp
int main() { Sample HHH {"HHH"}; Sample JJJ {"FFFF"}; // overloadされた+オペレータが呼ばれる。値は'HHHJJJ' HHH + JJJ; // overloadされた-オペレータが呼ばれる。値は'hhh' Sample XXX = -HHH; }
上記の例は、引数の左側(+の場合ね) は必ずSampleクラスのオブジェクトでないといけません。
こんな感じですが、メンバ変数じゃない変数を使っちゃうとエラーになってしまいます。
そんなときは!
Non-Memberとしてオーバーロード
sample.h
class Sample { public: char *str; private: // lowercaseに変える friend Sample operator-(Sample &obj) const; // 文字列をくっつける friend Sample operator+(const Sample &lstr, const Sample &rstr) const; // Constructor等は省略 }
あとは省略しますが、上記のようにしておけば、クラスのメンバ外で
Cスタイルstringので、Sample ZZZ = "AAA" + HHH
とかもいけるって感じです!