
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++の最初の方の簡単な例題にこれと同様なやり方が
あった気がしますが手元に無いため確認が取れなくて困ってしまっています・・。
No.3
- 回答日時:
ついでですが, 「型A から型B に変換する」のは 2通りの書き方があります:
1.B に「型A のオブジェクトを受け取る (1引数で呼び出せる) コンストラクタ」を作る
2.A に「型B への変換演算子」を作る
どちらも同じように「型A のオブジェクトを型B に変換する」ためのユーザ定義演算子として動作します (ので, 両方あるとダメ).
A, B が両方ともユーザ定義のクラスであればどちらの方法でもいいのですが, 一方が組み込み型だと (そこに手を加えることは不可能なので) もう一方の「ユーザ定義のクラス」で定義することしかできません (A, B ともに組み込み型の場合はそもそもプログラムで変換方法を定義できない). つまり A が組み込み型だと1のみ, B が組み込み型だと2のみが可能です.
今回はこの最後のパターンにあてはまるので, 「文字列クラス」に変換演算子を定義する必要があります.
No.2
- 回答日時:
この場合だと、
class CString
{
…
public:
operator LPCTSTR() const;
…
};
というメンバを定義すれば実現できます。
やや分かりにくいですが、返却値の型はLPCTSTRになります。
ただ、このような変換関数を定義するのは、あまりよい設計とはいえません。
できれば、std::basic_stringのc_strのようにメンバ関数にするか、もっと欲を言えば、非メンバ関数にした方がよいでしょう(friendが必要になるでしょうが)。
内部で管理するリソースは、外から触れないようにした方がよいのです。どうしてもやるなら、プログラマに警告する意味でも、構文をなるべく汚くすべきです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0の「vbFromUnicode」はVB....
-
C#で文字列を数値に変換する方法
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
【C++/CLI】int型からString型...
-
C++/CLI System::String::Fotma...
-
C#でListとDictionaryの判別方法
-
vb6の桁数指定
-
文字列クラスをoperatorオーバ...
-
sscanfの16進出力の逆処理
-
textbox.textやlabel.captionの...
-
16進をASCIIコードに変換する...
-
2進数から10進数へ変換
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
『列名 '担当者CD' があいま...
-
VBAコンボボックスの内容が反映...
-
大量の変数を定義するにはどう...
-
フォームからのデータの受け渡...
-
VB6のテキストボックスに入力し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0の「vbFromUnicode」はVB....
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
WORD型をCString型に変換する方法
-
C#で文字列を数値に変換する方法
-
C++ 文字列変数と16進数の比較
-
16進コード文字列を文字列に変換
-
vb6の桁数指定
-
16進をASCIIコードに変換する...
-
2の補数の計算について
-
VBAのstrConv関数のUNICODE変換...
-
10進数を2進数
-
【C++/CLI】int型からString型...
-
数値の値を時刻に変換する方法...
-
ASPでVBのFormat関数のような機...
-
c# 暗黙/明示的型変換の許容範囲
-
EXCEL VBA
-
Boolean型変数の値を反転する方法
-
数字→漢数字変換
-
日付を変換したい
-
対数変換のついて
おすすめ情報