是否可以在辅助函数中泛化对象类型?

Is it possible to generalize an object type in a helper function?

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

假设我有一个 A 的成员函数,它执行一些计算,始终创建 A 类型的对象。指向这些对象的指针被添加到存储在调用函数的对象中的数组中。函数 returns void 不带参数。在 class B 中,我想做完全相同的计算,只是创建 B 类型的对象。我正在尝试编写一个可以在两个位置调用的辅助函数,在一个位置创建 A 类型的对象,在另一个位置创建 B 类型的对象。

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

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.
}

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

这可以高效地完成吗?我知道我可以复制并粘贴代码并更改它以创建 B 对象并切换到 运行 一个或另一个,或者只有 A 中的一个版本和 B 中的一个版本,但我试图避免使用这些方法中的任何一种。

在我看来,为此使用虚函数会很好。但是如果你真的想要,你可以用一些 CRTP 来绕过它。

如果我们添加一个 CLASS_IMPL class 来保存辅助函数并使其派生自 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.
}