首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

强制引用转换解决办法

2012-03-16 
强制引用转换typedefstruct{intlengthunsignedshort*data}UStringclassRecord{public:QStringfield1..

强制引用转换
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),转而使用标准提供的更安全的类型转换,以增强代码的健壮性!

热点排行