CStringクラス
abdev 7月 25th, 2006オペレータのオーバーロードがほとんど出来上がったので、試しにCStringのデモコードを書いてみました。
Class CString Public m_lpszBuffer As LPSTR m_length As Long Sub CString() m_lpszBuffer=calloc(1) m_length=0 End Sub Sub ~CString() free(m_lpszBuffer) m_lpszBuffer=0 End Sub Function Operator() As LPSTR Return m_lpszBuffer End Function Sub Operator= (ByRef objString As CString) m_length=objString.m_length m_lpszBuffer=realloc(m_lpszBuffer,m_length+1) memcpy(m_lpszBuffer,objString.m_lpszBuffer,m_length) m_lpszBuffer[m_length]=0 End Sub Sub Operator= (lpszText As LPSTR) m_lpszBuffer=realloc(m_lpszBuffer,lstrlen(lpszText)+1) lstrcpy(m_lpszBuffer,lpszText) m_length=lstrlen(lpszText) End Sub Function Operator+ (lpszText As LPSTR) As CString Dim tempString As CString tempString=This tempString.m_lpszBuffer=realloc( tempString.m_lpszBuffer, tempString.m_length+lstrlen(lpszText)+1) lstrcpy( tempString.m_lpszBuffer+tempString.m_length, lpszText) tempString.m_length+=lstrlen(lpszText) Return tempString End Function Function Operator+ (ByRef objString As CString) As CString Dim tempString As CString tempString=This tempString.m_lpszBuffer=realloc( tempString.m_lpszBuffer, tempString.m_length+objString.m_length+1) memcpy( tempString.m_lpszBuffer+tempString.m_length, objString.m_lpszBuffer,objString.m_length) tempString.m_length+=objString.m_length tempString.m_lpszBuffer[tempString.m_length]=0 Return tempString End Function End Class
パラメータの型を識別しながらオーバーロードしていくのは良いのですが、キャストされることを見越して、戻り値でオーバーロードの解決を行うためには、コンパイラのほうをもう一捻りしなくてはなりません。
CStringは仮の名前なので、クラスが完成したらString型へ変更しようと思います。で、コンパイラにこびりついている従来のString型をすべて解除する方向で行きたいと思います。スマートに行ってくれることを祈ります・・・・・
7月 25th, 2006 at 17時23分17秒
そういえば比較の=ってどうやって実装するんでしょうか?C++っぽく==とかでしょうか?
7月 25th, 2006 at 19時09分54秒
> 戻り値でオーバーロードの解決を行うためにはこれは変換演算子(Function Operator() As LPSTR)のことですよね。だったら暗黙の変換はできない,キャスト演算子(As)で明示しなければならないとしたら楽ではないでしょうか。暗黙の変換は賛否両論ありますし,後から変換演算子を暗黙の変換にも適用されるようにしても遅くないと思います。それまでとの互換性を保ったままに行えますし。
7月 26th, 2006 at 1時49分31秒
比較演算子は”==”でいこうと思います。ABの場合はどうしても代入演算と一致比較演算が同一の記号になっているので、致し方なさそうです。他の案としましては、代入演算を ”Operator Substitution” にするとか…(冗長だなぁ〜(Function Operator() As LPSTR)に関しては、呼び出し先の状況(左辺の型や関数の仮引数とか)を見て自動的にオーバーロードする仕組みにしようかと思っています。こうすれば、要求される型を戻り値に持つメソッドを呼ぶようになりますので。勿論、As演算子で戻り値の型を明示的に要求することもできるようにしたいと思っています。あとの詳しいことは、フォーラムで!