为什么我需要这个CString类型转换?

问题描述:

我已经动了我的琴弦资源,幸运的是我有LPCTSTR运算符实例的字符串方便,如:为什么我需要这个CString类型转换?

CString str((LPCSTR) IDS_MY_STRING); 

现在我想做的事与MessageBox的相似类型转换(),所以它从资源加载的字符串,以及使我这样做:

MessageBox(hWnd, (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

但是这不起作用,它编译,但在运行时崩溃。现在做如下工作:

MessageBox(hWnd, (CString) (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

我的问题是,的MessageBox()接受LPCTSTR作为第二个参数反正那么为什么我们必须从LPCTSTR另外类型强制转换为CString的,使这项工作?

其他人已经解释了类型转换等的细节。

此外,为了简化代码,您可能希望#define方便的宏是这样的:

#define _S(id) (CString(LPCTSTR(id))) 

,然后用MessageBox使用(或其他LPCTSTR参数以及):

MessageBox(hWnd, _S(IDS_MY_STRING), _S(IDS_TITLE), MB_RETRYCANCEL); 

MessageBox没有超载获取资源ID,但您可以使用AfxMessageBox来代替。

+0

对,但在这种情况下我不能使用'AfxMessageBox'。 – zar 2012-04-17 21:06:04

您的IDS_MY_STRING不是真的指向字符串的指针。这是一个整数。 (如果它是一个字符串指针,你永远不需要LPCTSTR强制转换。)CString知道如何从整体资源ID加载资源字符串。

MessageBox不;它需要一个真实的字符指针,其中CString隐含地提供。

真正的问题(或者至少是答案的有趣部分)不太关于第二次失败的原因,更多关于第一次失败的原因。

第一个工程,因为CString的构造函数采用LPCSTR实际上查看值,以确定它是否真的是指向字符串的指针或字符串资源的标识符。在后一种情况下,它会自动加载字符串资源并创建一个具有相同内容的CString。 IOW,你得到了一个从字符串标识符到CString的隐式转换。

CString还支持隐式转换为LPCSTR/LPCSTR/LPCWSTR。

C++,但是,将只执行一个用户定义的隐式转换从被传递到需要用于表达任何类型的任何类型来获得。在这种情况下,要从字符串ID获得LPCTSTR,您需要从字符串ID到CString的两个字符,以及另一个从CStringLPCTSTR。编译器不会为你自动完成。

因此,从字符串ID到LPCTSTR得到,你需要明确从字符串ID转换为CString,它采用CString的构造函数的LPCTSTR。因此,您将字符串ID转换为LPCTSTR,并将其从CString创建为CString。然后编译器会自动将CString转换为一个(真正的)LPCTSTR。

+0

你最后一段有点令人困惑。我想你想说的是我们仍然需要一个从'字符串ID'到'CString'的转换。比CString有隐式转换为LPCTSTR。通过对'(CString)(LPCTSTR)'进行类型转换,我们正在从ID到CString进行一次转换。 – zar 2012-04-17 21:21:52

+0

编写'CString(((LPCTSTR)IDS_MY_STRING)'而不是两个明确的强制转换是不是更具可读性? – 2012-04-17 21:39:01

+0

@ChristianAmmer:是的,无论如何,我可能会那样做。 – 2012-04-17 22:42:17