c++ - C++ 中两个非常相似的类,只有一种不同的方法 : how to implement?

标签 c++ templates function virtual

除了一个方法之外,我有两个几乎相同的类。这些类具有相同的数据部分和所有成员函数,但只有一个:

class A {
private:
  double data;
public:
  double calc(){
     return data*data;
  }
   double especific(){
     return 2.0*data;
  }
 }

除了特定的方法外,第二个类是相同的。

这个成员函数特别需要计算所有成员数据,所以按值或引用传递不是一个选项。有没有一种方法可以在没有大量代码重复的情况下实现这一点?要么只使用一个类,要么使用模板,但不继承(巨大的性能影响)。

谢谢

编辑:感谢所有回复。策略模式对我的情况有帮助,我会尝试一下,看看它是否有效。基于我在不同程序中所做的一些测试,我正在避免将虚拟继承视为瘟疫。这个例程将在任何地方被调用,性能是一个非常重要的因素。

最佳答案

这听起来像是 Strategy pattern 的工作.在这种情况下,它可以作为模板参数来实现。通常它会作为类的构造函数参数或 setter 方法实现,但这需要继承才能正常工作。

在这种情况下,类似于:

template <class SpecificStrategy>
class A {
 private:
    double data;
 public:
    double calc(){
       return data*data;
    }
    double especific() {
       return SpecificStrategy::especific(data);
    }
};

class DoubleStrategy {
   static double especific(double data) {
      return 2 * data;
   }
};
class TripleStrategy {
   static double especific(double data) {
      return 3 * data;
   }
};

那你可以引用:

A<DoubleStrategy> x;
A<TripleStrategy> y;

xy 将是完全不相关的类型,但在这种情况下听起来这不是您想要的。

现在,在我看来,使用虚函数和继承是可行的方法。正如其他人指出的那样,性能损失并不大。然而,在某些情况下,我可以看出这不是一个好主意。

例如,如果此类旨在表示图形包中的 vector ,并且您要对数百万个 vector 进行相同的转换,那么我可以看出您不希望虚函数调用是进行转换的代码的一部分。事实上,您可能希望避免任何类型的指针取消引用,您可以帮助它。

关于c++ - C++ 中两个非常相似的类,只有一种不同的方法 : how to implement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640017/

相关文章:

c++ - 指向具有显式构造函数的对象的指针

c++ - 如何在C++中实现通用指针类型

c++ - 如何知道 std::list 是否已被修改

javascript - 重复扰乱功能,直到输出与输入不同

java - Spark SQL 长 double 值带有指数

c++ - 使用多重继承实现Entity-Component编程

c++ - STL:指针关联排序容器:排序谓词模板

c++ - CRTP 容器

c++ - 使用不完整类型 void 的模板类

python - NumPy 对象方法和 NumPy 函数调用有什么区别?