如何使用 std::cout 输出 CString 变量?

Nai*_*Tap 1 c++ mfc

代码:

CString a = "a";
CStringArray arr;
arr.Add(a);

cout << a << endl;
cout << arr[0] << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

000001E46FEDD8F8
000001E46FEDD8F8
Run Code Online (Sandbox Code Playgroud)

预期输出:

a
a
Run Code Online (Sandbox Code Playgroud)

输出不是字符串而是地址。

如何输出CString数据而不是输出其地址?

Jer*_*fin 6

正如其他人已经指出的那样,您可以使用强制转换获得您想要的行为。如果(例如)您只是为了调试而打印该值,我想这就足够了——当您准备好发布代码时,带有强制转换的代码将早已消失,没有任何迹象表明它曾经存在过,所以没有其他人必须忍受它。

但是,如果您计划将 a 写入CStringaniostream作为程序操作的正常部分,我认为几乎必须operator<<专门编写一个重载来完成该工作,因此在其余代码中您可以编写cout << arr[0] << endl;:你最初的意图是,它会正常工作。我会将其弹出到标题中,以便您可以将其包含在需要的地方。这可能应该被重载CStringACStringW与每个一起正常工作:

#pragma once

std::ostream &operator<<(std::ostream &os, CStringA const &s) {
    return os << s.GetString(); // or use the cast, if you prefer
}

std::wostream &operator<<(std::wostream &os, CStringW const &s) { 
    return os << s.GetString();
}
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可以添加重载以将 a 写入CStringW窄流和/或将 aCStringA写入宽流。