- ベストアンサー
文字列クラスをoperatorオーバーロードで実装したい
ATLにCStringという文字列クラスがあり、それを参考に operatorによる演算子オーバーロードで同じようなものを開発していて 一つだけ分からないことがありました。 CStringだと関数に文字列を受け渡す時にこのようなことができます。 #include <windows.h> #include <tchar.h> #include <atlstr.h> void func( LPCTSTR String ) { MessageBox( NULL, String, NULL, MB_OK ); } int main() { CString cStr = _T("テスト"); func( cStr ); } 分からないのはfunc( cStr );の部分です。 このように関数に受け渡す時のオーバーロードはどのように書けば良いのでしょうか? 何かEffectiveC++の最初の方の簡単な例題にこれと同様なやり方が あった気がしますが手元に無いため確認が取れなくて困ってしまっています・・。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「文字列クラス」の中で operator LPCTSTR() を定義する.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ついでですが, 「型A から型B に変換する」のは 2通りの書き方があります: 1.B に「型A のオブジェクトを受け取る (1引数で呼び出せる) コンストラクタ」を作る 2.A に「型B への変換演算子」を作る どちらも同じように「型A のオブジェクトを型B に変換する」ためのユーザ定義演算子として動作します (ので, 両方あるとダメ). A, B が両方ともユーザ定義のクラスであればどちらの方法でもいいのですが, 一方が組み込み型だと (そこに手を加えることは不可能なので) もう一方の「ユーザ定義のクラス」で定義することしかできません (A, B ともに組み込み型の場合はそもそもプログラムで変換方法を定義できない). つまり A が組み込み型だと1のみ, B が組み込み型だと2のみが可能です. 今回はこの最後のパターンにあてはまるので, 「文字列クラス」に変換演算子を定義する必要があります.
お礼
そういうものもあったんですね。勉強してみることにします。ありがとうございました!
- jacta
- ベストアンサー率26% (845/3158)
この場合だと、 class CString { … public: operator LPCTSTR() const; … }; というメンバを定義すれば実現できます。 やや分かりにくいですが、返却値の型はLPCTSTRになります。 ただ、このような変換関数を定義するのは、あまりよい設計とはいえません。 できれば、std::basic_stringのc_strのようにメンバ関数にするか、もっと欲を言えば、非メンバ関数にした方がよいでしょう(friendが必要になるでしょうが)。 内部で管理するリソースは、外から触れないようにした方がよいのです。どうしてもやるなら、プログラマに警告する意味でも、構文をなるべく汚くすべきです。
お礼
なるほど・・とても参考になりました。ありがとうございます。
お礼
すみません。まさにそれでした。 質問直後に思い出してしまいました。でも回答ありがとうございます。