转换操作符问题

Conversion operator issues

本文关键字:问题 操作符 转换      更新时间:2023-10-16

我今天早些时候偶然发现了这个"问题"。

我有这个类,它包含一个转换操作符。比如:

class myClass {
public:
    ...
    operator anotherClass*() { return anotherClassPtr; }
    ...
}

现在这一切都运行良好…直到我犯了这个愚蠢的错误:

void yetAnotherClass::foo(myClass* _p_class) 
{
  ...
  anotherClass* lp_anotherClass = (anotherClass*)_p_class;
  ...
}

我花了很长时间才弄清楚为什么lp_AnotherClass ptr被设置为非零,而我确信_p_class中的anotherClassPtr为0。

有什么我可以添加到myClass,以防止我犯这个错误吗?(即编译器会吐出一些错误)是否有可能防止对象ptr被强制转换为其他东西?

anotherClass* lp_anotherClass = (anotherClass*)_p_class;

首先,不应该使用c风格的强制转换。使用c++风格的强制转换。这将节省您的时间,因为编译器会立即告诉您问题:

auto* lp_anotherClass = static_cast<anotherClass*>(_p_class); //ERROR

其次,首选explicit转换函数:

explicit operator anotherClass*() { return anotherClassPtr; }

为什么我推荐explicit转换函数,因为它避免了由隐式转换引起的微妙bug,另外,它增加了代码的可读性!

注意explicit转换函数是c++ 11的特性