0

首先,这是这个问题的后续问题:如何删除相似的 const 和非 const 成员函数之间的代码重复?

假设我有一个抽象类,提供一个纯虚函数:

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 成员函数 Execute() 。在对用户必须实现两个函数而不是(更不用说会发生什么,如果我们向基类添加一些其他纯虚函数......)这一事实进行了一点挣扎之后,我想出了以下解决方案:

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 版本,而不是非 const 版本。

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

在此先感谢,勒内。

4

1 回答 1

3

是的,如果您希望用户调用您提供的带有consta 或非const this指针的方法,那么您必须至少提供要调用的函数的一个const版本。请注意,您可以const使用非const this指针调用方法。

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

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

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

也许通过完全消除非const成员函数。

于 2013-10-24T14:56:46.107 回答