使用相同方法但不同成员类型构造类的最佳方法

时间:2017-08-13 18:01:33

标签: c++ inheritance

寻找有关如何改进以下代码以最大限度地重复使用的一些建议。 A类有一个矩阵成员,可用于多种方法。 B类与A类相同(方法是直接复制 - 粘贴)但矩阵成员是不同的并且是不同类型的。

class A
{
public:
    A() { set_matrix(); };
    double operator()() { // uses method1 and method2 };
protected:
    Matrix_Type_A matrix;
    void set_matrix();
    double method1() { // uses matrix };
    double method2() { // uses matrix };
}

class B 
{ 
public:
    B() { set_matrix(); };
    double operator()() { // uses method1 and method2 };
protected:
    Matrix_Type_B matrix;
    void set_matrix();
    double method1() { // uses matrix. Identical to method1 in class A };
    double method2() { // uses matrix. Identical to method2 in class A };
}

理想情况下,我想重新使用类方法,其中底层代码适用于两种矩阵类型。

我最初的想法是创建一个具有新成员 matrix 的子类,但我不认为这会起作用,因为继承的方法仍然指向基类变量,而不是派生变量。例如。像这样的东西:

class A
{
public:
    A() { set_matrix(); };

protected:
    Matrix_Type_A matrix;
    void set_matrix();
    double method1() { // uses matrix };
    double method2() { // uses matrix };
}

class B : class A
{ 
private:
    Matrix_Type_B matrix;
    void set_matrix();
}

或者,我认为我可以使用包含这些方法的通用基类,然后使用不同的矩阵成员继承A类和B类。问题是,基类不会编译,因为方法引用的是仅存在于派生类中的成员。

关于如何构建此建议的任何建议/想法都非常赞赏。

修改

模板解决方案似乎有效。我已实施以下

template <class T> class A
{
public:
    A() { set_matrix(); };

protected:
    T matrix;
    virtual void set_matrix() = 0;
    double method1() { // uses matrix };
    double method2() { // uses matrix };
}

class B : class A<Matrix_Type_A>
{ 
public:
    B() { set_matrix(); };
private:
    void set_matrix();
};

class C : class A<Matrix_Type_B>
{ 
public:
    C() { set_matrix(); };
private:
    void set_matrix();
}

1 个答案:

答案 0 :(得分:1)

您如何确保Matrix_Type_AMatrix_Type_B具有相同的方法?如果它们都是声明共享功能的公共父类的子类(或者如果你可以让它们像这样共享父类),只需将matrix变量声明为该父类型。

如果没有,您可以制作模板类:

template<class Matrix>
class C
{
    ...
protected:
    Matrix matrix;
    ...
}

并使用C<Matrix_Type_A>C<Matrix_Type_B>作为您的课程。