如何减少具有相同名称但不同类型的数据成员的类上的代码重复?

jag*_*ttt 2 c++ class-design

设计这样的课时我遇到了麻烦

class C1 {
public:
  void foo();
}

class C2 {
public:
  void foo();
}
Run Code Online (Sandbox Code Playgroud)

C1和C2有相同的方法foo(),

class Derived1 : public Base {
public:
  void Update() {
    member.foo();
  }
private:    
  C1 member;
}

class Derived2 : public Base {
public:
  void Update() {
    member.foo(); 
  }
private:    
  C2 member;
}
Run Code Online (Sandbox Code Playgroud)

Derived类的Update()完全相同,但成员的类型不同.所以我必须为每个新的派生类复制Update工具.

这是减少此代码重复的方法吗?我只提出了一个宏的解决方案.我认为有一种更优雅的方式来解决这个模板,但我无法弄清楚..

编辑: 非常感谢,但我想我错过了一些东西..

我正在使用c ++

2.实际上,每个Derived类都有大约5个成员,它们都支持foo()方法,并且派生自相同的基类.我的情况是我已经编写了一个(非常长的)Update()方法,它可以适用于每个派生类而无需任何修改.所以我只是将这个Update()复制并粘贴到每个新类的Update()中,这会导致可怕的代码重复.我想知道是否有一种方法我不需要过多地重写Update()并且可以减少重复.

再次

Leo*_*Hat 6

这正是类模板的设计应用程序.它们允许类中的函数在不同的数据类型上运行,而无需复制算法和逻辑.

这个维基百科页面将为您提供编程模板的良好概述.

这是让您入门的基本想法:

template  <class T>
class CTemplateBase
{
public:
    void Update()
    {
        member.foo();
    }
private:
    T member; // Generic type
}

class CDerived1 : public CTemplateBase<C1>
{
    // No common algorithms required here
}

class CDerived2 : public CTemplateBase<C2>
{
    // No common algorithms required here
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是那些派生的,为什么不只是:"typedef Dervied1 CTemplateBase <C1>;" 和"typedef Dervied2 CTemplateBase <C2>;" (显然派生的不再是一个好名字,但你明白了). (2认同)