2011-08-24 143 views
2

我非常瞭解將CString轉換爲C風格字符的技巧。其中之一是使用strcpy/_tcscpy,其他包括使用CStrBuf從CString轉換爲char */TCHAR *

問題:

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. 

是的,這是絕對有可能寫的函數(最好是一個模板)。但是這涉及到的調用的功能,並且它不是流暢的賦值運算符。

+0

我不知道,但你爲什麼不能定義一個全局'void運算符=(字符*&LHS,常量的CString&右)'?其中一個參數不是內置類型,所以重載應該是可能的。 –

+1

@Kerrek:賦值必須作爲非靜態成員函數重載。 –

+0

你不能在CString中使用GetBuffer(..)嗎? – Simon

回答

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); 
} 
+0

這太棒了。雖然不是完美的解決方案(這是不可能的),但非常感謝! – Ajay

0

CString上的運算符不會解決問題,因爲您需要複製到Destination緩衝區,儘管此分配會更改Destination的值,這是不可能的。

不知何故,你需要一個運營商實現這一目標行:

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

正如你所看到的,把源只有一半。您仍然需要複製到目標緩衝區。

此外,我不會推薦它,因爲Destination = Source行對於char[]語義完全是誤導。

唯一可能的這樣一個任務將是目的地的初始化:

char Destination[100] = Source; 
+0

如果我可以在'CString'類中編寫運算符,我就可以。並且完全可以複製到char/TCHAR數組 - 只需使用模板方法或傳遞其他大小參數即可。 – Ajay

2

您不能分配到陣列。這使得你想要的不可能。另外,說實話,這是一個非常錯誤的事情 - 一個魔術數字大小的緩衝區?

+0

不是魔法大小的緩衝區 - 模板魔法解決了它。 – Ajay

+0

其實你有權 - 即使在課堂上,我們也不能返回數組。 – Ajay