在成员函数中测试此指针是否合法C ++?

问题描述 投票:4回答:5

我有一个涉及不同类类型对象的应用程序。对象由指针引用。空指针表示关联的对象不存在。当前,调用代码很麻烦,因为每次使用指向对象的指针时,它都会测试该指针的值是否为null,并采取适当的措施使其为null。因为在不存在的情况下要采取的默认操作取决于对象的类型,所以我希望将其编码为对象本身的类,而不是在调用程序中。这将导致如下所示的构造:

class C
{ ... 
  void member_func() //non-virtual !
  { if (this) { do something with the object ... }
    else { take some default action }
  }
  ...
};

显然,成员函数不能是虚拟的,因为当对象不存在时查找表不存在,因此虚拟调用将失败。但是此代码对于非虚拟成员函数是否合法C ++?对于我尝试过的编译器来说,它似乎正常工作,但是我担心可能的不可移植性。在标准中,我找不到明确允许或明确禁止此类构造的条款。

c++ null this
5个回答
12
投票

this在成员函数中永远不会为null,因此您执行的检查是无用的。

正如Matthieu M.在评论中指出的,如果您在代码中执行类似的操作:

C* c = 0; 
c->member();

这将导致未定义的行为,这是不良


6
投票

如已指出,this永远不能为空指针。如果是这样,则您已经调用了未定义的行为。您可以改为创建一组重载函数,如下所示:

void DoTheThing(C* cp)
{
    if (cp)
        cp->member_func();
    else
    {
        // take some default action
    }
}

void DoTheThing(B* bp)
{
    if (bp)
        bp->some_other_member_func();
    else
    {
        // take some default action
    }
}

如果要调用的函数在每个类中都具有相同的名称,那么您可以在每个类中创建一个静态函数,该静态函数对该类执行默认操作(都具有相同的名称),并创建一个模板:

template<typname T>
void DoTheThing(T* tp)
{
    if (tp)
        tp->member_func();
    else
        T::default_action()
}

1
投票

标准上,该代码不合法​​,但是在实践中使用(实际上是不当行为。)>

实际上,IIRC MFC在内部使用这些检查。


1
投票

检查中


0
投票

我认为不允许这样做。您要求参考该标准。我相信第一件事是9.3.1非静态成员函数,1。:

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.