C++ 如何消除抽象类中类似常量和非常量成员函数之间的代码重复?
首先,这是这个问题的后续问题: 比方说,我有一个抽象类,提供一个纯虚拟函数:C++ 如何消除抽象类中类似常量和非常量成员函数之间的代码重复?,c++,pointers,inheritance,interface,constants,C++,Pointers,Inheritance,Interface,Constants,首先,这是这个问题的后续问题: 比方说,我有一个抽象类,提供一个纯虚拟函数: class ICommand { public: virtual ~ICommand() {}; virtual int Execute() = 0; protected: ICommand() {}; };//class ICommand 以及从该类继承的另一个类: class cCommand : public ICommand { public: cCommand() {};
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类型的对象的指针,但带有常量数据,如:
//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
问题是,我在常量对象上调用一个非常量成员函数。
因此,我要么在创建指针p时删除常量(我猜是坏的…),要么在ICommand中添加一个常量成员函数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
类ICommand
{
公众:
虚拟~ICommand(){};
虚拟int执行()
{//Scott Meyers路
返回static_cast(*this).Execute();
}
虚拟int Execute()常量=0;
受保护的:
ICommand(){};
};//类I命令
这似乎做得很好,但我不确定这是否适合解决我的问题。我也不认为这对用户来说是非常直观的,因为他总是要实现纯虚拟成员函数的常量版本,而不是非常量版本
我的实际问题是,是否有任何副作用我可能没有考虑,或者是否有更好的解决方案,我可能已经监督到目前为止这个问题
提前感谢,,
René。是的,如果您希望用户使用
常量或非常量此指针调用您提供的方法,则必须至少提供要调用的函数的常量版本。请注意,您可以使用非const
指针调用const
方法
考虑Execute
是否需要为非const
。如果您能够提供Execute
的const
版本,那么Execute
的非const
版本是完全不必要的,这至少是非零概率的
因此,在直接回答您的问题时:
如何消除相似常量和非常量之间的代码重复
抽象类中的成员函数
可能通过完全消除非常量
成员函数来实现。是的,如果您希望用户调用通过常量
或非常量
此
指针提供的方法,则必须至少提供要调用的函数的常量
版本。请注意,您可以使用非const
指针调用const
方法
考虑Execute
是否需要为非const
。如果您能够提供Execute
的const
版本,那么Execute
的非const
版本是完全不必要的,这至少是非零概率的
因此,在直接回答您的问题时:
如何消除相似常量和非常量之间的代码重复
抽象类中的成员函数
可能通过完全消除非常量
成员函数来实现。是的,如果您希望用户调用通过常量
或非常量
此
指针提供的方法,则必须至少提供要调用的函数的常量
版本。请注意,您可以使用非const
指针调用const
方法
考虑Execute
是否需要为非const
。如果您能够提供Execute
的const
版本,那么Execute
的非const
版本是完全不必要的,这至少是非零概率的
因此,在直接回答您的问题时:
如何消除相似常量和非常量之间的代码重复
抽象类中的成员函数
可能通过完全消除非常量
成员函数来实现。是的,如果您希望用户调用通过常量
或非常量
此
指针提供的方法,则必须至少提供要调用的函数的常量
版本。请注意,您可以使用非const
指针调用const
方法
考虑Execute
是否需要为非const
。如果您能够提供Execute
的const
版本,那么Execute
的非const
版本是完全不必要的,这至少是非零概率的
因此,在直接回答您的问题时:
如何消除相似常量和非常量之间的代码重复
抽象类中的成员函数
也许可以完全消除非常量
成员函数。一般来说,您是对的。最好的方法是避免函数的非const
版本。因此,选择这个例子是为了解决一个不幸的情况,即仅仅使用const
函数是不够的。总的来说,你是对的。最好的方法是避免函数的非const
版本。因此,选择这个例子是为了解决一个不幸的情况,即仅仅使用const
函数是不够的。总的来说,你是对的。最好的方法是避免函数的非const
版本。因此,选择这个例子是为了解决一个不幸的情况,即仅仅使用const
函数是不够的。总的来说,你是对的。最好的方法是避免函数的非const
版本。因此,选择该示例是为了解决一个不幸的情况,即仅使用const
函数是不够的。