2013-01-18 50 views
2

今天早些时候我偶然发现了这个“问题”。转换操作员问题

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

class myClass { 
public: 
    ... 

    operator anotherClass*() { return anotherClassPtr; } 

    ... 
} 

现在这一切运作良好..直到我做了这个愚蠢的错误:

void yetAnotherClass::foo(myClass* _p_class) 
{ 
    ... 

    anotherClass* lp_anotherClass = (anotherClass*)_p_class; 

    ... 
} 

而且我花了很长时间才明白,为什么lp_AnotherClass PTR设置为无事-zero,但我确信_p_class中的anotherClassPtr为0.

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

回答

6
anotherClass* lp_anotherClass = (anotherClass*)_p_class; 

首先,你不应该使用C风格的演员。使用C++-style转换。使用explicit转换功能

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

其次,喜欢:这将节省您的时间,因为编译器会告诉你马上问题

explicit operator anotherClass*() { return anotherClassPtr; } 

为什么我建议explicit转换功能,因为它避免了微妙错误来自隐式转换,此外,它增加了代码的可读性!

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

+0

感谢您的解释。不幸的是,恰当命名的“myClass”实际上并不是我的...所以我不能将它改为显式操作符(我们还没有切换到C++ 11)。 – Lieuwe

+0

@Lieuwe:很好。一旦你切换到C++ 11,开始采用更好的成语。暂时来说,你可以写一些类似'to_anotherClass()'的东西。这个想法是一样的:明确的! – Nawaz