全部,
我还在学习C ++但我在一个项目中遇到了一个问题,我正在修补我很好奇。我注意到当我尝试打印作为类成员的字符串的内容时,我获取内存地址而不是内容。我知道这是因为该项是一个指针,但我感到困惑的是我使用->
运算符来表示它。
为什么我可以使用->
运算符来判断if语句中的类成员是否取消引用它,但是当以相同的方式打印到文件字符串时,我会得到内存地址?
以下是一个例子:
假设我有一个名为pClass的类,其成员名为m_strEmployeeName
。作为附注(我不知道是否重要),m_strEmployeeName
值为CString
而不是std::string
,因此可能存在一些未知的转换问题。
如果我使用以下简单代码,我会得到一个内存地址。
std::ofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();
我使用以下解除引用方法获得相同的行为(我期望 - 因为&gt;是同样的事情)。
std::ofstream file("testfile.text");
file << (*pClass).m_strEmployeeName;
file.close();
对我做错了什么的想法?
答案 0 :(得分:2)
这是因为您的CString
类是包含CStringW
字符串的实际wchar_t
类,因此std::ofstream
不包含支持operator >>
的{{1}}重载字符串。要打印wchar_t*
类对象,您可以使用此类型的流CStringW
,它可以正确识别std::wofstream
字符串并输出正确。
wchar_t*
您也可以使用多字节字符支持创建程序。它可以在项目设置中指定。但我建议你留在UNICODE。
答案 1 :(得分:1)
尝试将CString
投射到char
指针:
file << (LPCTSTR)pClass->m_strEmployeeName;
请参阅:How to convert CString and ::std::string ::std::wstring to each other?
注意:这仅在您将TCHAR定义为8位时才有效。如果您使用的是16位UNICODE TCHAR,则还需要再转换一次。
以下是进行TCHAR
转化的一种方式:
char c_str[1000];
size_t ret;
wcstombs_s(
&ret,
c_str,
sizeof(c_str),
(LPCTSTR)pClass->m_strEmployeeName,
pClass->m_strEmployeeName.GetLength()
);
std::ofstream file("testfile.text");
file << c_str;
file.close();
如果您需要8位ASCII文件但可以使用UNICODE CString
,则非常有用。