Как повторно использовать один и тот же метод реализации для разных классов - PullRequest
1 голос
/ 05 мая 2019

Я практикую c ++ и застрял в следующих кодах, пытаясь их оптимизировать. Я хотел бы знать, могу ли я что-то сделать, чтобы оптимизировать реализацию их метода. Потому что методы такие же, за исключением минусов. Заранее спасибо.

dominios.h

class HP {
private:

  int valor;

  static const int LIMITE_INFERIOR = 0;
  static const int LIMITE_SUPERIOR = 1000;

public:

  void setValor(int);
  int getValor() {
    return valor;
  }
};

class MP {
private:

  int valor;

  static const int LIMITE_INFERIOR = 0;
  static const int LIMITE_SUPERIOR = 500;

public:

  void setValor(int);
  int getValor() {
    return valor;
  }
};

dominios.cpp

void HP::setValor(int valor) {

  if (valor < LIMITE_INFERIOR) this->valor = LIMITE_INFERIOR;
  else if (valor > LIMITE_SUPERIOR) this->valor = LIMITE_SUPERIOR;
  else this->valor = valor;
}

void MP::setValor(int valor) {

  if (valor < LIMITE_INFERIOR) this->valor = LIMITE_INFERIOR;
  else if (valor > LIMITE_SUPERIOR) this->valor = LIMITE_SUPERIOR;
  else this->valor = valor;
}

Как видите, setValor обоих классов одинаковы. Я пытался создать иерархию, используя «шаблон», но это не помогло мне из-за недостатков.

1 Ответ

3 голосов
/ 05 мая 2019
this->valor = std::clamp(valor, LIMITE_INFERIOR, LIMITE_SUPERIOR);

template <typename Tag, int lo, int hi>
class Metric {
private:
  int valor;

public:
  void setValor(int v) { valor = std::clamp(v, lo, hi); }
  int getValor() { return valor; }
};

struct HPTag;
using HP = Metric<HPTag, 0, 1000>;

struct MPTag;
using MP = Metric<MPTag, 0, 500>;
...