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
函数是不够的。