Все,
Я все еще изучаю C ++, но у меня есть проблема в проекте, над которой я возился, мне интересно. Я заметил, что когда я пытаюсь напечатать содержимое строки, которая является членом класса, я получаю адрес памяти вместо содержимого. Я понимаю, что это потому, что элемент является указателем, но меня смущает то, что я использую ->
Оператор, чтобы почтить его.
Почему я могу оценить члена класса в операторе if, используя ->
оператор, чтобы разыменовать его, но при печати в строку файла таким же образом я получаю вместо этого адрес памяти?
Пример ниже:
Допустим, у меня есть класс с именем pClass с членом под названием m_strEmployeeName
, Как примечание (я не знаю, имеет ли это значение), m_strEmployeeName
значение CString
скорее, чем std::string
так что может быть какая-то неизвестная проблема конверсии, возможно, также.
Если я использовал следующий простой код, я получаю адрес памяти.
std::ofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();
Я получаю то же поведение со следующим методом разыменования (что я ожидаю, так как -> это то же самое).
std::ofstream file("testfile.text");
file << (*pClass).m_strEmployeeName;
file.close();
Есть идеи, что я делаю не так?
Это потому, что ваш CString
класс действительно CStringW
класс, который содержит wchar_t
струны так std::ofstream
не содержат operator >>
перегрузить эту поддержку wchar_t*
строки. Печатать CStringW
объекты класса вы можете использовать этот тип потока std::wofstream
это признать wchar_t*
строки правильно и вывод будет правильным.
std::wofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();
Вы также можете создать свою программу с поддержкой многобайтовых символов. Это можно указать в настройках вашего проекта. Но я предлагаю вам остаться с UNICODE.
Попробуй кастинг CString
к char
указатель:
file << (LPCTSTR)pClass->m_strEmployeeName;
увидеть: Как преобразовать CString и :: std :: string :: std :: wstring друг в друга?
Примечание: это будет работать только если у вас есть 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
работать с.