是否可以在辅助函数中推广对象类型?

时间:2018-02-25 03:07:22

标签: c++ oop object subclass derived-class

我有一堂课CLASS。 A类和B类来自CLASS。 CLASS,因此A和B也有一个字段来保存指向CLASS指针数组的指针。

假设我有A的成员函数进行一些计算,从而创建A类型的对象。指向这些对象的指针将添加到存储在调用该函数的对象中的数组中。该函数返回void并且不带参数。在B类中,除了创建类型B的对象外,我想进行完全相同的计算。我正在尝试编写一个可以在两个位置调用的辅助函数,在一个地方创建类型A的对象,在另一个地方创建类型B的对象。

两个类A和B的构造函数是相同的,因为它们都是来自同一基类的派生类。在A类版本函数中,如果创建了对象A(x, y, z),我希望B类版本创建B(x, y, z),构造函数采用与A类版本完全相同的参数。这适用于创建的每个对象。

class CLASS {
public:
    CLASS** array
    int x, y;
    CLASS(CLASS** arr, int xcoord, int ycoord);
    virtual ~CLASS();
};

class A : public CLASS {
public:
    A(CLASS** arr, int xcoord, int ycoord);
    void foo();
    virtual ~A();
};

class B : public CLASS {
public:
    B(CLASS** arr, int xcoord, int ycoord);
    void foo();
    virtual ~B();
};

//in A.cpp, definition of foo()
void A::foo() {
    int a = some value
    if (some condition) { array[a + 1] = new A(array, (a + 1), y); }
    else if (other condition) { array[a - 1] = new A(array, (a - 1), y); }
    //etc.
}

//in B.cpp, definition of foo()
void B::foo() {
    int a = some value
    if (some condition) { array[a + 1] = new B(array, (a + 1), y); }
    else if (other condition) { array[a - 1] = new B(array, (a - 1), y); }
    //etc.
}

我对模板函数不太熟悉,但据我了解它们,它们允许您更改函数参数的类型和返回,这在这里似乎没有用。

这有效吗?我知道我可以复制并粘贴代码并将其更改为生成B对象并有一个开关来运行其中一个,或者只有一个版本在A中,一个版本在B中,但我试图避免使用其中任何一个方法。

1 个答案:

答案 0 :(得分:0)

在我看来,使用虚拟功能会很好。但如果你真的想要,你可以用一些CRTP来解决它。

如果我们添加一个CLASS_IMPL类来保存辅助函数并使其派生自CLASS

template <typename T>
class CLASS_IMPL : public CLASS {
    CLASS* makeNew (int x, int y) {
        CLASS* ptr = new T(array, x, y);
        return ptr;
    }
}

此处下方是我们需要更改AB才能使用

class A : public CLASS_IMPL<A> {

class B : public CLASS_IMPL<B> {

然后您可以继续更改B::foo以使用它。

void B::foo() {
    int a = some value
    if (some condition) { array[a + 1] = makeNew(a + 1, y); }
    else if (other condition) { array[a - 1] = makeNew(a - 1, y); }
    //etc.
}