在运行时更改对象的行为

Jen*_*eni 4 c++

如何在运行时更改对象的行为?(使用C++)

我将举一个简单的例子.我有一个Operator包含方法的类operate.我们假设它看起来像这样:

double operate(double a, double b){
  return 0.0;
}
Run Code Online (Sandbox Code Playgroud)

用户将给予一定的输入值ab,而会选择执行什么操作让我们说,他可以选择计算加法或乘法.鉴于它的输入,我被允许做的只是实例化Operator和调用operate(a, b),这正是我之前提到的.

计算乘法或加法的方法将在某处实现(不知道在哪里).

总之,我必须根据用户的输入更改Operator对象的行为.

Dan*_*ker 9

这样做的标准模式是使外部类具有指向"实现"类的指针.

// derive multiple implementations from this:
class Implementation
{
    virtual ~Implementation() {} // probably essential!

    virtual void foo() = 0;
};

class Switcheroo
{
    Implementation *impl_;

public:
    // constructor, destructor, copy constructor, assignment 
    // must all be properly defined (any that you can't define, 
    // make private)

    void foo()
    {
        impl_->foo();
    }
};
Run Code Online (Sandbox Code Playgroud)

通过将所有成员函数转发Switcherooimpl_成员,您可以在需要时切换到不同的实现.

这种模式有多种名称:Pimpl("私有实现"的缩写),智能参考(与智能指针相反,由于前导成员功能),它与代理和桥接模式有一些共同之处.


Rob*_*uld 6

我只是把它作为琐事提到,不能再多说一点,但我们走了......

警告危险!!!

我认为,我所看到的一个愚蠢的伎俩叫做抓紧,但这只是为了真正的愚蠢.基本上你将virtualtable指针交换到另一个类的指针,它可以工作,但它理论上可以破坏世界或导致一些其他未定义的行为:)

不管怎么说,只使用动态分类和kosher C++,但作为一个实验,上面是有趣的...