BCBのAnsiStringクラスの拡張

解決


ハイジ  2005-06-28 05:27:37  No: 15962

AnsiStringクラスの拡張

どちらかというと(pascalでなく)C++の初歩的なことかもしれませんが、質問させていただきます。もし、知っている方がいたら、ご教授ください。

AnsiStringは非常に便利ですが、添え字カウントが1から始まるのがややこしく、また、自分自身が慣れていることを理由に、STLのstringを多用しています。
AnsiStringとstringが混在しても、c_str()をつかって相互に変換すれば問題ありません。でも、コードが増えて行くにつれ、めんどくさいと思い始めました。

たとえば、

AnsiString as;
string s;

のとき

as = as + s.c_str();

とかきますが、一般関数を用いた演算子多重定義を使って自動化させることができました。つまり

AnsiString operator+(AnsiString& a , string& b )
{
  return (a + AnsiString(b.c_str()));
}

を定義してやれば、

as = as + s;

と記述することが可能になります。

今回悩んでいるのは、、

string s;
Edit1->Text = s.c_str();

を、なんとかできないかです。

たとえば、AnsiStringメンバ関数による演算子多重定義を使って、

AnsiString AnsiString::operator=( string s )
{
  return AnsiString( s.c_str() );
}

などを定義できれば、

Edit1->Text = s;

でいいわけです。しかし、AnsiStringクラスの宣言のヘッダには

AnsiString AnsiString::operator=( string s );

の宣言がないわけで、オリジナルのヘッダ自体を書き換えなくてはいけません。クラスの付け足し宣言とかって、できないですよねぇ。

前述のように一般関数を用いた演算子多重定義が、operator=でできないか試してみましたが、operator=はメンバ関数でないとだめというエラーがでます。
教科書てきには、クラスのメンバ関数を拡張したいなら、AnsiStringを全て継承し、operator=も加えた、新しいAnsiStringクラスでも作れ、ということでしょうが、VCLのプロパティの多くがAnsiStringなので、最終的にAnsiStringにしなくてはいけないので、意味がありませんし・・・・

もしかして、なにか初歩的な勘違いとかしてるのでしょうか?
別の方法でも、なにか、いい方法があるでしょうか?


えと  2005-06-28 05:40:18  No: 15963

> なにか初歩的な勘違いとかしてるのでしょうか?

してます。ここはDelphiのBBSです。


こちら  2005-06-28 05:51:31  No: 15964

BCBの質問掲示板はこちらです。
http://bx.misty.ne.jp/~h-kova/


ハイジ  2005-06-28 07:36:19  No: 15965

了解しました。


aea  2005-06-28 09:57:59  No: 15966

ちょっと無理っぽいっと思います。
AnsiStringも継承できるかどうか・・・

あと、BCBの掲示板、こちらにもあります。

http://gimite.ddo.jp/bcbqtree/


ハイジ  2005-06-28 11:37:03  No: 15967

ありがとうございます。ブックマークいたしました。
今回のは解決チェックしときます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加