首先,这是对此问题的跟进问题: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成员函数Execute()。 稍微考虑一下这个事实后,用户必须实现两个函数(更不用说发生了什么,如果我们将其他一些纯虚函数添加到基类......),我提出了以下解决方案:< / 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版本,而不是非常量函数。
我的实际问题是,是否有任何副作用我可能没有考虑过,或者如果有更好的解决方案可以解决这个问题,我可能已经监督到目前为止。
提前致谢, 勒。
答案 0 :(得分:3)
是的,如果您希望用户使用const
或非const
this
指针调用您提供的方法,则必须至少提供 < / em>要调用的函数的const
版本。请注意,您可以使用非const
const
指针调用this
方法。
考虑Execute
是否需要非const
。至少有一个非零的机会,如果您能够提供const
Execute
版const
版,那么非Execute
版本的const
完全没必要。< / p>
所以,直接回答你的问题:
如何删除类似const和非const之间的代码重复 抽象类中的成员函数?
可能完全取消非{{1}}成员函数。