如何删除抽象类中类似const和非const成员函数之间的代码重复?

时间:2013-10-24 14:53:41

标签: c++ pointers inheritance interface const

首先,这是对此问题的跟进问题:How do I remove code duplication between similar const and non-const member functions?

让我们说,我有一个抽象类,提供一个纯虚函数:

class ICommand
{
public:
    virtual ~ICommand() {};
    virtual int Execute() = 0;

protected:
    ICommand() {};
};//class ICommand

另一个继承自这个的类:

class cCommand : public ICommand
{
public:
    cCommand() {};
    virtual ~cCommand() {};
    virtual int Execute()
    {
        int retval = 0;
        //do something and return appropriate error code

        return retval;
    }
};//class cCommand

现在我需要一个指向ICommand类型对象的指针,但需要使用const数据,如:

//using a smart pointer here would be better, but it shows the problem
ICommand const * p = new cCommand();

int retval = p->Execute();  //won't compile

问题是,我在const对象上调用非const成员函数。 所以我要么在创建指针p时删除const(坏,我猜......)或者我还要向ICommand添加一个const成员函数Exec​​ute()。 稍微考虑一下这个事实后,用户必须实现两个函数(更不用说发生了什么,如果我们将其他一些纯虚函数添加到基类......),我提出了以下解决方案:< / p>

class ICommand
{
public:
    virtual ~ICommand() {};
    virtual int Execute()
    {   //Scott Meyers way
        return static_cast<const ICommand&>(*this).Execute();
    }
    virtual int Execute() const = 0;

protected:
    ICommand() {};
};//class ICommand

这似乎做得很好,但我不确定这是否是我问题的合适解决方案。我认为这对用户来说非常直观,因为他总是必须实现纯虚拟成员函数的const版本,而不是非常量函数。

我的实际问题是,是否有任何副作用我可能没有考虑过,或者如果有更好的解决方案可以解决这个问题,我可能已经监督到目前为止。

提前致谢, 勒。

1 个答案:

答案 0 :(得分:3)

是的,如果您希望用户使用const或非const this指针调用您提供的方法,则必须至少提供 < / em>要调用的函数的const版本。请注意,您可以使用非const const指针调用this方法。

考虑Execute是否需要非const。至少有一个非零的机会,如果您能够提供const Executeconst版,那么非Execute版本的const完全没必要。< / p>

所以,直接回答你的问题:

  

如何删除类似const和非const之间的代码重复   抽象类中的成员函数?

可能完全取消非{{1}}成员函数。