我有一种情况,我有一个类 A,它包含与类 B 相同的功能, 但是 A 在堆栈上定义了自己的对象来执行函数,而 B 从外部获取它的对象。
两个类中每个函数的对象名称和语法相同。
(编造的)示例:
class A
{
private:
int numbers[200];
public:
A() {};
int do_stuff()
{
return numbers[0] + numbers[1];
}
};
class B
{
private:
int *numbers;
public:
A(int *num): numbers(num) {};
int do_stuff()
{
return numbers[0] + numbers[1];
}
};
尽管这是一个微不足道的示例,但您可以看到如果有 20 个函数并且每个函数都是另一个函数的复制粘贴,那么它会变得多么浪费。
请不要浪费集体精力争论为什么 A 比 B 更好,反之亦然,我知道我想要实现的目标,而且与上述不同,这并不简单。
您的问题改写为:“我有两个用例。一次我需要执行
X
,另一次我需要执行 X
和 Y
。我怎样才能避免实施 X
两次?”
为什么要实施两次
X
?使用你已有的。
class B
{
private:
int *numbers;
public:
B(int *num): numbers(num) {}
int do_stuff() { return numbers[0] + numbers[1]; }
};
class A {
private:
int numbers[200];
public:
B b{&numbers[0]};
};
您要求将设计方面的考虑放在一边,因此我只展示最简单的,但代价是要求用户在使用
a.b.do_stuff
时编写 A
。
您可以使用模板来实现这一点。
#include <type_traits>
template <typename T>
class X {
public:
X() requires(!std::is_pointer_v<T>) = default;
explicit X(T n) requires std::is_pointer_v<T>
: numbers(n) {}
int do_stuff() { return numbers[0] + numbers[1]; }
private:
T numbers;
};
using A = X<int[200]>;
using B = X<int*>;
int main() {
int ar[2]{};
A a;
B b(ar);
}
您正在尝试使用的现有代码库,还是您自己的代码? 如果是后者 - 我建议重构它。 如果是前者,您可以为返回 int* 的类指定 getter,并定义接受 int* 并对其进行处理的函数。但这并不安全。