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

问题描述 投票:0回答:2

代码:

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

cout << a << endl;
cout << arr[0] << endl;

输出:

000001E46FEDD8F8
000001E46FEDD8F8

预期输出:

a
a

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

如何输出

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

强转换为

const char*
未解决。

c++ mfc
2个回答
2
投票

operator<<
有很多不同的重载。如果给定上下文中有多个适合,编译器有选择最适合的规则。在本例中,它选择为您提供对象的地址而不是字符串的内容。

CString
最方便的属性之一是它将隐式转换为指向 const 字符数组的指针。你说“强转化”不行,但你做对了吗?

cout << static_cast<const char *>(a) << endl;

注意

CString
不是一个单独的类;它是一个扩展为
CStringA
CStringW
的宏,具体取决于您的编译器设置,无论您是否配置为使用窄字符串或宽 (Unicode) 字符串。如果您直接明确使用
A
W
变体而不是让编译器为您选择它,您可以避免一些意外。

至于在当今时代您是否应该使用

CString
,那就更复杂了。它是为在 Microsoft 的 MFC 和 ATL 框架中使用而发明的,如果您仍在使用其中之一,您可能将无法摆脱它。就在三年前,我也遇到过这样的情况。我相信它甚至比
std::string
std::wstring
还要古老。


1
投票

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

但是,如果您计划将

CString
写入
iostream
作为程序操作的正常部分,我认为几乎必须专门编写
operator<<
的重载来完成这项工作,所以在其余的代码您可以按照您最初的意图编写:
cout << arr[0] << endl;
,并且它将正常工作。我会将其弹出到标题中,以便您可以将其包含在需要的地方。这可能应该被重载,以便
CStringA
CStringW
能够正常工作:

#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();
}

根据您的需要,您可以添加重载以将

CStringW
写入窄流和/或
CStringA
写入宽流。

© www.soinside.com 2019 - 2024. All rights reserved.