转换运算符问题

时间:2013-01-18 16:12:44

标签: c++ operator-overloading

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

我有这个类,它包含一个转换运算符。类似的东西:

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被转换为其他东西?

1 个答案:

答案 0 :(得分:6)

anotherClass* lp_anotherClass = (anotherClass*)_p_class;

首先,你不应该使用C风格的演员表。使用C++-style强制转换。这样可以节省您的时间,因为编译器会立即告诉您问题:

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

其次,更喜欢使用explicit转化功能:

explicit operator anotherClass*() { return anotherClassPtr; }

为什么我建议使用explicit转换功能,因为它避免了隐式转换带来的细微错误,此外,它还提高了代码的可读性!

请注意,explicit转换函数是C ++ 11的一项功能。