是否可以在辅助函数中泛化对象类型?
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;
}
}
这里的缺点是我们需要将 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.
}
我有一个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;
}
}
这里的缺点是我们需要将 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.
}