2013-05-05 63 views
1

我嘗試爲練習目的創建自己的小String類。我想重載const wchar_t *操作符來返回保存在String對象中的緩衝區,但是當我實際訪問這個對象時它失敗了。它的轉換操作符不被調用。它僅適用,當我下明確鍵入通過(const wchar_t*) mystring運算符重載,沒有明確的類型轉換

編輯編制對象:

// CString.h 
class CString { 
private: 
    wchar_t* _string; 

    void set(const wchar_t text[]); 

public: 
    CString(); 
    CString(const wchar_t text[]); 
    CString(const CString& text); 

    ~CString(); 

    operator const wchar_t*() const; 
}; 

// CString.cpp 
#include "CString.h" 

CString::CString() { set(L""); } 
CString::CString(const wchar_t text[]) { set(text); } 
CString::~CString() { delete[] _string; } 

void CString::set(const wchar_t text[]) { 
    delete[] _string; 

    _string = new wchar_t[wcslen(text)]; 
    wcscpy(_string, text); 
} 

CString::operator const wchar_t*() const { 
    return _string; 
} 

// main.cpp 
int main() { 
    CString* helloWorld = new CString(L"Test 123"); 

    MessageBox(NULL, helloWorld, L"", MB_OK);  // This doesn't work 
    MessageBox(NULL, (const wchar_t*) helloWorld, L"", MB_OK); // This works, but I don't explicitly want to use the cast everytime. 

    return 0; 
} 
+0

歡迎來到SO。您可能希望包含字符串類中的相關運算符重載代碼,以及如何使用它的示例以及您看到的行爲。否則,回答你的問題將會非常困難。這通常會導致問題被關閉。 – leander 2013-05-05 23:22:11

+0

在那裏我們去...... – 2013-05-05 23:44:31

+0

也許我錯過了一些東西,但你期望你的操作符是爲對象本身工作,指向對象的指針 – 2013-05-05 23:56:14

回答

0

首先,如果您在Windows工作,CString從ATL/MFC類。重複使用同一個名字作爲你自己的類是不禮貌的。

如果你不是,你應該提供MessageBox的簽名。

我假設你在Windows世界工作。

您的問題是CString*CString不是一回事。您定義了一個運營商將CString變成wchar_t const*。毫不奇怪,這不適用於CString*

helloWorld的定義更改爲CString helloWorld = CString(L"Test 123"); - no new,no pointer - and your code works。

另一方面,您做的顯式轉換導致了未定義的行爲,因爲它將指向對象的指針重新解釋爲指向字符緩衝區的指針。這是爲什麼使用C風格演員是一個壞主意的許多原因之一,因爲重新演繹演員和靜態演員之間的區別需要大量的上下文。要查看錯誤,請將您的MessageBox調用更改爲MessageBox(NULL, static_cast<const wchar_t*>(helloWorld), L"", MB_OK);使用顯式轉換的代碼是否曾運行並打印出任何明智的內容?

如果您確實必須將helloWorld放入免費商店,請在使用它時對其進行解除引用(在隱式轉換和顯式轉換的情況下)。即,用helloWorld替換*helloWorld。我會建議反對它 - 沒有充分的理由在免費商店中存儲這個特定的實例。