读书人

强制引用转换解决办法

发布时间: 2012-03-16 16:34:56 作者: rapoo

强制引用转换
typedef struct
{
int length;
unsigned short *data;
}UString;

class Record
{
public:
QString field1;
...
};
extern "C "
void QString2UString(QString &src,UnicodeString &dst)
{
...
}


//调用该函数编译错误, 望高手赐教
//error: can not conver const QString to QString &
void fun(const Record& record)
{
UString temp;
QString2UString(record.field1,temp);
}

//而这个调用确顺利通过编译,不解,望高手赐教
void fun1()
{
Record record;
record.field1 = "field1 ";
UString temp;
QString2UString(record.field1,temp);
}

//我的解决方案,能顺利通过编译,并经过单元测试正确,但不知
//是否有潜在的问题?,望高手赐教
void fun(const Record& record)
{
UString temp;
QString2UString((QString &)record.field1,temp);
}

[解决办法]
强制去掉const是一个很危险的行为,不要做这种事情。
把你的void fun(const Record& record)
写为void fun(Record& record)即可。
或者如果你知道QString2UString的功能,那么
void fun(const Record& record)
{
QString src = record.field1;
UString temp;
QString2UString(src,temp);
}

[解决办法]
根据你的程序上下文推断,我假定你的程序中有QString和UString类,并在这二者这间,你已有了转换措施(例如转换构造函数)!

第一个问题:

//调用该函数编译错误, 望高手赐教
//error: can not conver const QString to QString &
void fun(const Record& record)
{
UString temp;
QString2UString(record.field1,temp);//接受了非常量型对象!
}
fun函数的原型说明,该函数的形参是一个指向常型Record对象的引用,当你传入一个常型Record对象时,其成员QString对象变量field1也就是一个常量对象了!然而
void QString2UString(QString &src,UnicodeString &dst)函数原型说明该函数接受2个非常型QString对象的引用!这样,当你调用fun的时候,其内部的QString2UString()函数调用就引发了一个非常型record的引用指向了一个常型record对象的错误,这是语言所不允许的,因而触发:
编译期错误: "error: can not conver const QString to QString & "!

第二个问题:

//而这个调用确顺利通过编译,不解,望高手赐教
void fun1()
{
Record record;
record.field1 = "field1 ";
UString temp;//很好,都是非常量型变量!

QString2UString(record.field1,temp);//形参和实参类型匹配!
}

fun1函数行为良好,是因为如上注释: "形参和实参类型匹配 ",没有非常型对象引用指向常型对象的问题。

第三个问题:

//我的解决方案,能顺利通过编译,并经过单元测试正确,但不知
//是否有潜在的问题?,望高手赐教
void fun(const Record& record)
{
UString temp;
QString2UString((QString &)record.field1,temp);
}

上述形参表中的强制类型转换,对你的具体程序而言没有潜在的问题,因为record.field1本来就是一个QString,编译器只要产生一个临时的引用变量指向你的record.field1作为实参就可以了。

今天,许多C++大师称强制类型转换是对类型糸统的攻击行为(我非常同意这样的说法),因而新的C++标准规定了更安全的转型设施,如dynamic_cast <> 等,因此,作为新时代的C++程序员,我强烈推荐你抛弃C风格的强制类型转换(type),转而使用标准提供的更安全的类型转换,以增强代码的健壮性!

读书人网 >C++

热点推荐