C++ 没有显式类型转换的运算符重载

C++ 没有显式类型转换的运算符重载,c++,string,class,operator-keyword,C++,String,Class,Operator Keyword,我试着制作自己的小弦乐课程,以供练习之用。我想重载const wchar\u t*操作符以返回保存在String对象中的缓冲区,但当我实际访问该对象时,它失败了。它的转换运算符未被调用。只有当我通过constwchar\u t*mystring显式地输入cast对象时,它才起作用 编辑: 首先,如果您在windows中工作,CString是来自ATL/MFC的一个类。在自己的类中重复使用相同的名称是不礼貌的 如果没有,则应该为MessageBox提供签名 我假设你在Windows世界工作 你的问

我试着制作自己的小弦乐课程,以供练习之用。我想重载const wchar\u t*操作符以返回保存在String对象中的缓冲区,但当我实际访问该对象时,它失败了。它的转换运算符未被调用。只有当我通过constwchar\u t*mystring显式地输入cast对象时,它才起作用

编辑:


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

如果没有,则应该为MessageBox提供签名

我假设你在Windows世界工作

你的问题是CString*和CString不是一回事。您定义了一个操作符来将CString转换为wchar\u t const*。毫不奇怪,这对CString*不起作用

将helloWorld的定义更改为CString helloWorld=CStringLTest 123;-没有新的,没有指针-你的代码可以工作

另一方面,显式强制转换会导致未定义的行为,因为它将指向对象的指针重新解释为指向字符缓冲区的指针。这就是为什么使用C风格强制转换是个坏主意的众多原因之一,因为重新解释强制转换和静态强制转换之间的差异需要大量的上下文。要查看错误,请将MessageBox调用更改为MessageBox NULL,static\u casthelloWorld,L,MB\u OK;带有显式强制转换的代码是否运行并打印过任何合理的内容


如果您确实必须将helloWorld放在免费存储中,那么在隐式和显式强制转换情况下使用helloWorld时,请取消对它的引用。即,将helloWorld的用法替换为*helloWorld。我建议不要这样做-没有很好的理由将此特定实例存储在免费商店中。

欢迎使用SO。您可能希望包含字符串类中的相关运算符重载代码,以及您试图如何使用它的示例,以及您看到的行为。否则很难回答你的问题,;这通常会导致问题被关闭。也许我遗漏了什么,但您希望对象本身的运算符用于指向对象的指针
// 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;
}