1

为了练习目的,我尝试制作自己的小型字符串类。我想重载 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;
}
4

1 回答 1

0

首先,如果你在windows下工作,CString是来自ATL/MFC的一个类。为自己的类重用相同的名称是不礼貌的。

如果不是,您应该为MessageBox.

我假设您在 Windows 世界中工作。

您的问题是 aCString*与 a 不同CString。您定义了一个运算符来将 aCString转换为 a wchar_t const*。毫不奇怪,这不适用于CString*.

将定义更改helloWorldCString helloWorld = CString(L"Test 123"); -- no new, no pointers -- 你的代码就可以工作了。

另外,您所做的显式转换会导致未定义的行为,因为它将指向对象的指针重新解释为指向字符缓冲区的指针。这是使用 C 风格转换是一个坏主意的众多原因之一,因为重新解释转换和静态转换之间的区别需要大量上下文。要查看错误,请将 MessageBox 调用更改MessageBox( NULL, static_cast<const wchar_t*>(helloWorld), L"", MB_OK); 为具有显式强制转换的代码是否曾经运行并打印任何合理的内容?

如果您确实必须放入helloWorld免费存储,请在使用它时取消引用它(在隐式和显式转换情况下)。即,用 替换helloWorld使用*helloWorld。我建议不要这样做——没有充分的理由将此特定实例存储在免费商店中。

于 2013-05-05T23:53:19.370 回答