Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 选择类的风格以在运行时实现函数?_C++_Inheritance_Multiple Inheritance - Fatal编程技术网

C++ 选择类的风格以在运行时实现函数?

C++ 选择类的风格以在运行时实现函数?,c++,inheritance,multiple-inheritance,C++,Inheritance,Multiple Inheritance,我想向远程站点发送数据和功能描述。在远程站点接收到数据后,我希望查看描述并创建一个对象(通过工厂方法),当我在该对象上调用exec时,该对象正是我想要的 示例: 1) 发送[3,(添加5)]=>接收(obj);obj->exec()->8 2) 发送[3,(添加-1,多个2)]=>接收(obj);obj->exec()->4 我曾想过在某种形式的多重继承中使用加法器类和multer类,但我想不出什么,因为这涉及到从不同的功能排列中创建许多类。我想我需要学点东西:)模板?我主要关心的是exec()

我想向远程站点发送数据和功能描述。在远程站点接收到数据后,我希望查看描述并创建一个对象(通过工厂方法),当我在该对象上调用exec时,该对象正是我想要的

示例:

1) 发送[3,(添加5)]=>接收(obj);obj->exec()->8

2) 发送[3,(添加-1,多个2)]=>接收(obj);obj->exec()->4

我曾想过在某种形式的多重继承中使用加法器类和multer类,但我想不出什么,因为这涉及到从不同的功能排列中创建许多类。我想我需要学点东西:)模板?我主要关心的是exec()函数中的零条件也可以轻松添加新功能


谢谢

你说你不想为不同的能力排列构建单独的类,我同意。但是你能把你的“能力”分成一组原子运算和另一组组合运算吗。如果它们都来自一个公共的“executor”对象,并带有一个虚拟的“exec”方法,那么这可能会起到以下作用:

class executor {
  public:
  virtual double exec();
};

class constant_exec : public executor {
  public:
  constant_exec(double value) : m_value(value) {}
  double exec() {return m_value;}
  private:
  double m_value;
};

class add_op : public executor {
  public:
  add_op(executor const *lhs, executor const* rhs) : m_lhs(lhs), m_rhs(rhs){}
  double exec() {return rhs->exec + lhs->exec;}
  private:
  executor const* m_rhs, m_lhs;
};
  ... and so on
这样,您可以建立任意复杂的操作。您确实需要担心正确地处理执行器对象,因此您可能希望考虑使用共享的(可能是弱的)指针,尽管这会对性能产生一些轻微的影响。
-matt

exec()中没有条件的原因是什么?因为我会经常使用这种方法,而且代码必须快速。我的意思是,我不能每次执行时都测试所有可能的组合。顺序并不重要,但我可能只是要说明明显的。。。但是通过网络发送数据的成本不是比ifs高很多吗?我可以想出很多理由来提供函子或类似的东西,而不是一堆if-else或switch案例。。。但性能将不是其中之一。请注意,分支预测失误可能会影响性能,但没有太多机会“猜测”虚拟方法分派将在哪里结束,因此它可能也会在那里产生影响。exec函数被调用了数十亿次,而我真的希望[dispatch]将执行一次。感谢您的时间。这最终会是一个解析树吗?我不知道如何以这种方式组合不同的操作。好吧,这至少是一个评估树。在上面的第二个示例中,构造的对象看起来像:
new mul_op(new const_exec(2)、new add_op(new const_exec(-1)、new const_exec(3))
。如果您的消息只是乘法/加法链,那么这应该很容易构建。