我有一堂课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中,但我试图避免使用其中任何一个方法。
答案 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;
}
}
此处下方是我们需要更改A
和B
才能使用
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.
}