当 C++ 类所操作的成员对象定义不同时(堆栈与堆),如何在 C++ 类之间共享函数?

问题描述 投票:0回答:3

我有一种情况,我有一个类 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 更好,反之亦然,我知道我想要实现的目标,而且与上述不同,这并不简单。

c++ function class inheritance
3个回答
0
投票

您的问题改写为:“我有两个用例。一次我需要执行

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


0
投票

您可以使用模板来实现这一点。

#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);
}

-2
投票

您正在尝试使用的现有代码库,还是您自己的代码? 如果是后者 - 我建议重构它。 如果是前者,您可以为返回 int* 的类指定 getter,并定义接受 int* 并对其进行处理的函数。但这并不安全。

© www.soinside.com 2019 - 2024. All rights reserved.