【问题标题】:Conversion from CString to char*/TCHAR*从 CString 转换为 char*/TCHAR*
【发布时间】:2011-11-02 17:37:09
【问题描述】:

我非常了解将CString 转换为C 风格字符的技术。其中之一是使用strcpy/_tcscpy,其他包括使用CStrBuf

问题:

char Destination[100];
CStringA Source; // A is for simplicity and explicit ANSI specification.

Source = "This is source string."

现在我想要这个:

Destination = Source;

自动发生。嗯,这在逻辑上意味着在CString 类中编写一个转换运算符。但是,尽管它是隐含的,但我没有 特权 来更改 CString 类。

我想写一个全局转换操作符和全局赋值操作符。但它不起作用:

operator char* (const CStringA&); // Error - At least must be class-type
operator = ... // Won't work either - cannot be global.

是的,绝对可以编写函数(最好是模板函数)。但这涉及到调用函数,作为赋值运算符并不流畅。

【问题讨论】:

  • 我不确定,但你为什么不能定义一个全局的void operator=(char * & lhs, const CString & rhs)?其中一个参数不是内置类型,因此重载应该是可能的。
  • @Kerrek:赋值必须作为非静态成员函数重载。
  • 你不能使用 CString 中的 GetBuffer(..) 吗?
  • CString 分配给固定大小的缓冲区有什么用?
  • @R.玛特:哦,当然。嗯。也许您可以滥用其他一些您可以全局重载的很少使用的运算符?

标签: c++ visual-c++ mfc atl cstring


【解决方案1】:

您不能分配给数组。这使您想要的成为不可能。另外,老实说,这是一个非常错误的做法 - 一个幻数大小的缓冲区?

【讨论】:

  • 其实你说得对——即使在课堂上,我们也不能返回数组。
【解决方案2】:

好吧,我不想说这是值得推荐的,但你可以劫持一些不常用的运算符来快速破解:

void operator<<=(char * dst, const std::string & s)
{
  std::strcpy(dst, s.c_str());
}

int main()
{
  char buf[100];
  std::string s = "Hello";

  buf <<= s;
}

您甚至可以为静态大小的数组安装一个适度安全的模板版本:

template <typename TChar, unsigned int N>
inline void operator<<=(TChar (&dst)[N], const std::string & s)
{
  std::strncpy(dst, s.c_str(), N);
}

【讨论】:

  • 这太棒了。虽然不是完美的解决方案(无论如何这是不可能的),但非常感谢!
【解决方案3】:

CString 上的运算符无法解决问题,因为您需要复制到 Destination 缓冲区,尽管此分配会更改 Destination 的值,这是不可能的。

不知何故,您需要一个运算符来实现这一行:

strcpy(Destination, LPCSTR(Source)); // + buffer overflow protection

如您所见,转换 Source 只是完成了一半。您仍然需要复制到目标缓冲区。

另外,我不推荐它,因为 Destination = Source 行在 char[] 语义方面完全具有误导性。

唯一可能的此类分配是对 Destination 的初始化:

char Destination[100] = Source;

【讨论】:

  • 如果我可以在CString 类中编写运算符,我会的。并且完全可以复制到 char/TCHAR 数组 - 只需使用模板方法,或传递额外的大小参数。
猜你喜欢
  • 2015-08-06
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2020-06-12
  • 2010-10-25
  • 2019-01-05
相关资源
最近更新 更多