最近的编译器,例如clang,抱怨如果一个函数测试是否"这个"是NULL,因为根据标准这是非法的。
我有一个大量使用它的程序,我正在尝试清理它。以下是一些不警告的例子 - 这些是否安全?有没有一种很好的方法来获得符合C ++标准的 - > toAA和 - > toAB功能行为? (理想情况下,不会更改调用这些函数的代码,并且速度相当快 - 请参阅下面的注释,在GCC 4.6中测试速度更快。)
#include <stddef.h>
class ClassAA;
class ClassAB;
class ClassBase {
public:
enum Type {AA, AB};
Type m_type;
ClassAA* toAA();
ClassAB* toAB();
ClassBase(Type t) : m_type(t) {}
virtual ~ClassBase() {}
};
class ClassAA : public ClassBase { public: int a; ClassAA():ClassBase(AA) {} };
class ClassAB : public ClassBase { public: int b; ClassAB():ClassBase(AB) {} };
// toAA and toAB are intended to have same function,
// but toAB is significantly better performing on GCC 4.6.
inline ClassAA* ClassBase::toAA() { return dynamic_cast<ClassAA*>(this); }
inline ClassAB* ClassBase::toAB() { return (this && m_type == AB) ? static_cast<ClassAB*>(this) : NULL; }
int foo(ClassBase* bp) {
if (bp && bp->toAA()) // Legal
return -1;
if (dynamic_cast<ClassAA*>(bp)) // Legal
return -1;
if (!bp->toAA()) // No warning, is this legal?
return -1;
if (bp->toAA()->a) // No warning, is this legal?
return 10;
if (bp->toAB()->b) // Warning due to use of "this", illagal presumably
return 20;
return 0;
}
答案 0 :(得分:1)
让它们成为自由函数,或者static
成员参与。
必须在现有对象上调用非静态成员函数;周期。
您的编译器可能没有警告,因为您没有取消引用this
,因此不会触发其检测算法。但这并没有使行为不那么明确。对于所有你知道的事情,编译器可能会省略警告然后偷偷摸摸制作煎饼。