CStringクラス

オペレータのオーバーロードがほとんど出来上がったので、試しに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型をすべて解除する方向で行きたいと思います。スマートに行ってくれることを祈ります・・・・・