2013-05-05 67 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。我会建议反对它 - 没有充分的理由在免费商店中存储这个特定的实例。

相关问题