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にしなくてはいけないので、意味がありませんし・・・・
もしかして、なにか初歩的な勘違いとかしてるのでしょうか?
別の方法でも、なにか、いい方法があるでしょうか?
> なにか初歩的な勘違いとかしてるのでしょうか?
してます。ここはDelphiのBBSです。
BCBの質問掲示板はこちらです。
http://bx.misty.ne.jp/~h-kova/
了解しました。
ちょっと無理っぽいっと思います。
AnsiStringも継承できるかどうか・・・
あと、BCBの掲示板、こちらにもあります。
http://gimite.ddo.jp/bcbqtree/
ありがとうございます。ブックマークいたしました。
今回のは解決チェックしときます。
ツイート | ![]() |