我有一个涉及不同类类型的对象的应用程序.对象由指针引用.空指针表示关联的对象不存在.目前,调用代码很麻烦,因为每次使用指向对象的指针时,它都会测试指针值为null,并采取一些适当的操作,它为null.因为在不存在的情况下要采取的默认操作取决于对象的类型,我宁愿在对象本身的类中而不是在调用程序中对其进行编码.这导致如下构造:
class C
{ ...
void member_func() //non-virtual !
{ if (this) { do something with the object ... }
else { take some default action }
}
...
};
Run Code Online (Sandbox Code Playgroud)
显然,成员函数不能是虚拟的,因为当对象不存在时查找表不存在,并且虚拟调用将失败.但这个代码是否适用于非虚拟成员函数的合法C++?它似乎对我尝试过的编译器工作正常,但我担心可能的不可移植性.在标准中,我找不到明确允许或明确禁止此类结构的条款.
izo*_*ica 12
this 在成员函数中永远不会为null,因此您执行的检查是无用的.
正如Matthieu M.在评论中指出的那样,如果你在代码中做了类似的事情:
C* c = 0;
c->member();
Run Code Online (Sandbox Code Playgroud)
这会导致未定义的行为,这是不好的.
正如已经指出的那样,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
}
}
Run Code Online (Sandbox Code Playgroud)
如果要调用的函数在每个类中具有相同的名称,那么您可以在每个类中创建一个静态函数,该函数执行该类的默认操作(都具有相同的名称),并创建一个模板:
template<typname T>
void DoTheThing(T* tp)
{
if (tp)
tp->member_func();
else
T::default_action()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |