重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【終了しました】教えて!goo新規会員登録

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++の最初の方の簡単な例題にこれと同様なやり方が
あった気がしますが手元に無いため確認が取れなくて困ってしまっています・・。

A 回答 (3件)

「文字列クラス」の中で


operator LPCTSTR()
を定義する.
    • good
    • 0
この回答へのお礼

すみません。まさにそれでした。
質問直後に思い出してしまいました。でも回答ありがとうございます。

お礼日時:2008/02/12 19:38

ついでですが, 「型A から型B に変換する」のは 2通りの書き方があります:


1.B に「型A のオブジェクトを受け取る (1引数で呼び出せる) コンストラクタ」を作る
2.A に「型B への変換演算子」を作る
どちらも同じように「型A のオブジェクトを型B に変換する」ためのユーザ定義演算子として動作します (ので, 両方あるとダメ).
A, B が両方ともユーザ定義のクラスであればどちらの方法でもいいのですが, 一方が組み込み型だと (そこに手を加えることは不可能なので) もう一方の「ユーザ定義のクラス」で定義することしかできません (A, B ともに組み込み型の場合はそもそもプログラムで変換方法を定義できない). つまり A が組み込み型だと1のみ, B が組み込み型だと2のみが可能です.
今回はこの最後のパターンにあてはまるので, 「文字列クラス」に変換演算子を定義する必要があります.
    • good
    • 0
この回答へのお礼

そういうものもあったんですね。勉強してみることにします。ありがとうございました!

お礼日時:2008/02/12 20:04

この場合だと、



class CString
{
 …
public:
 operator LPCTSTR() const;
 …
};

というメンバを定義すれば実現できます。
やや分かりにくいですが、返却値の型はLPCTSTRになります。

ただ、このような変換関数を定義するのは、あまりよい設計とはいえません。
できれば、std::basic_stringのc_strのようにメンバ関数にするか、もっと欲を言えば、非メンバ関数にした方がよいでしょう(friendが必要になるでしょうが)。
内部で管理するリソースは、外から触れないようにした方がよいのです。どうしてもやるなら、プログラマに警告する意味でも、構文をなるべく汚くすべきです。
    • good
    • 0
この回答へのお礼

なるほど・・とても参考になりました。ありがとうございます。

お礼日時:2008/02/12 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!