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