我很清楚将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
类。
我想过编写一个全局转换opertor和全局赋值运算符。但它不起作用:
operator char* (const CStringA&); // Error - At least must be class-type
operator = ... // Won't work either - cannot be global.
是的,绝对可以编写函数(最好是模板函数)。但这涉及调用函数,并且它不像指派运算符那样平滑。
答案 0 :(得分:2)
您无法分配数组。这使你想要的东西变得不可能。而且,老实说,这是一个非常错误的事情 - 魔术数量大小的缓冲区?
答案 1 :(得分:1)
好吧,我不想说这在任何方面都是值得推荐的,但你可以劫持一些较少使用的运算符来快速破解:
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);
}
答案 2 :(得分:0)
CString
上的运算符无法解决问题,因为您需要复制到Destination
缓冲区,尽管此赋值会更改Destination的值,这是不可能的。
不知何故,你需要一个操作员来实现这一行:
strcpy(Destination, LPCSTR(Source)); // + buffer overflow protection
正如您所看到的,转换Source只有一半。您仍然需要复制到目标缓冲区。
此外,我不推荐它,因为Destination = Source
行在char[]
语义方面完全具有误导性。
唯一可能的此类任务是初始化目的地:
char Destination[100] = Source;