编写具有依赖于继承成员的函数的基类的正确方法

乔尔

我有两个类要从基类派生,因为它们共享极其相似的函数和成员变量,并且这两个类之间唯一的主要区别是SomeClassvs SomeOtherClassfor algo解决此类问题的最佳方法是什么?

class A
{
    virtual doSomething(); // is it possible to implement it here instead so I don't repeat code?
    int shared_param_1;
    int shared_param_2;
}
class SGBM : public A
{
    SGBM()
    {
        algo->SGBMSpecificFunction();
    }

    std::shared_ptr<SomeClass> algo;

    doSomething()
    {
        algo->compute();
        // long code
    }

    int SGBM_param_1;
    int SGBM_param_2;
}
class BM : public A
{
    BM()
    {
        algo->BMSpecificFunction();
    }

    std::shared_ptr<SomeOtherClass> algo;

    doSomething()
    {
        algo->compute();
        // long completely similar code relying on algo
    }

    int BM_param_1;
    int BM_param_2;
}

谢谢!

科里斯托

我认为最常见的方法是使用strategy pattern,即,SomeClass并且SomeOtherClass需要从公共接口派生,您将通过构造函数将算法注入基类:

class Algorithm
{
public:
  virtual ~Algorithm() = default;
  virtual void algo() = 0;
};

class SomeClass : public Algorithm
{
public:
  void algo() override;
};

class SomeOtherClass : public Algorithm
{
public:
  void algo() override;
};

class A
{
public:
  explicit A(std::unique_ptr<Algorithm> algorithm)
    : algorithm{std::move(algorithm)} {}

  void do_something() { algorithm->algo(); }
private:
  std::unique_ptr<Algorithm> algorithm;
};

class SGBM : public A
{
public:
  explicit SGBM() : A{std::make_unique<SomeClass>()} {}
};

class BM : public A
{
public:
  explicit BM() : A{std::make_unique<SomeOtherClass>()} {}
};

但是,这要求您能够修改SomeClassSomeOtherClass(或编写包装器)。如果这不方便,您也可以为此使用CRTP

template <typename Concrete>
class A
{
public:
  void do_something() { static_cast<Concrete*>(this)->algo->compute(); }
};

class SGBM : public A<SGBM>
{
private:
    std::shared_ptr<SomeClass> algo;
    friend class A<SGBM>;
};

class BM : public A<BM>
{
private:
    std::shared_ptr<SomeOtherClass> algo;
    friend class A<BM>;
};

如果您需要一个公共基类,BM并且SGBM您需要引入一个额外的基类,A然后从中继承。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何有一个依赖于类的模板参数的成员函数实现?

模板问题,静态继承。无法为成员依赖于类型的类 Sorter 完成代码

C ++变量在类的所有实例中使用依赖于类的类型和函数具有相同的值

具有依赖于Java中未指定类的功能

当类依赖于隐式时,是否有惯用的方法将类转换为对象?

C ++依赖于派生类的纯虚函数

具有依赖于关联类型的界限的默认方法的特性

C ++从具有相同名称的成员的基类继承

从C#中具有依赖接口的Abstract类继承的正确方法

依赖于特定类类型的C ++模板方法?

C ++在超类构造函数中,依赖于子类重写的许多变量的代码的正确运行方式是什么?

编写依赖于IntersectionObserver调用的测试

如何在类型依赖于派生类的基础模板类中声明成员?

如何正确编写依赖于值的自定义反应挂钩?

TypeScript:如何初始化依赖于 T 的泛型类的成员?

具有参数的基类构造函数的继承

使用依赖于上下文绑定的选择编写类型类

使用依赖于数据帧的多列的 if 语句编写 R 函数

如何动态更新依赖于其他成员的成员?

.NET依赖注入具有依赖于其他通用服务的通用服务

为什么Python的C3 MRO依赖于公共基类?

Python:如何从依赖于模块的另一个文件中正确导入函数

朱莉娅:如何正确定义使用依赖于数字的类型的函数?

指向具有受保护继承的基类方法的指针

EmberJS:全局类函数使用Ember-Simple-Auth依赖于会话变量。最佳实践?

部署依赖于 Web 应用程序类的 Azure 函数

使类中的函数指针依赖于初始化值

如何在 Kotlin/Arrow 中调用依赖于多个类型类的多态函数

“特殊方法的隐式使用始终依赖于特殊方法的类级绑定”