Правильный абстрактный класс

252
15 декабря 2016, 16:07

Помогите, пожалуйста, правильно описать абстрактный класс Block.

Есть некий абстрактный класс Block с методом virtual execute(). У этого метода есть наследники:

  1. Sum
  2. Dif
  3. VecSum //сумма всех элементов вектора
  4. VecMult // произведение вектора на число
  5. ...

Каждый из эти классов должен унаследовать метод execute и переопределить его, но у каждого класса метод execute принимает разные по типу параметры и возвращает разный результат. Например, в VecSum execute принимает vector<int>, возвращает int. В VecMult принимает vector<int>, возвращает vector<int>. Описывая метод execute в абстрактном классе Block, я должен указать тип возвращаемого результата и аргументы.

Как мне правильно описать Block::execute или же реализовать методы в классах наследниках? Организовать нужно таким образом, чтобы потом можно было создать класс наследник, например, Sqrt, который смог бы переопределить метод execute и возвратить корень из числа, при этом никак не изменяя класс Block.

язык c++ vs2012 os windows

Answer 1

Я думаю, что в данном случае не нужен абстрактный класс. Какой с него смысл, если входные и выходные типы всегда различные?

Вызывающему классу придется как-то догадываться о типе.

В классическом чистом С это делалось указателем на void. Но в плюсах так не делают.

Но если очень сильно-сильно хочется выстрелить себе в ногу веревкой (с), то просто создайте специальный класс "аргумент" и используйте его в качестве входного и выходного. Где-то так:

class Arg{
public:
  int getArgCount();
  void* getArg(); // тут наверно лучше шаблоны или что то подобное
}
Answer 2
template<typename T>
class executor;
template<typename R, typename... A>
class executor<R(A...)>
{...}
template<typename... A>
class executor<void(A...)>
{...}

R - тип возвращаемого значения, A - список аргументов.
Задавайте частичный специализации вместо наследования, это компилтайм. :)

READ ALSO
Время выполнения кода

Время выполнения кода

Какую функцию стоит использовать, чтобы получить значение, которое не будет фиксировать время других процессов? Язык С++

294
Сброка QT-приложения linux (Ubuntu)

Сброка QT-приложения linux (Ubuntu)

Пытаюсь собрать приложение, компилятор выдает ошибку:

241
Обработка событий ОС (Linux, X-server)

Обработка событий ОС (Linux, X-server)

Как обрабатывать сообщения операционной системы в одном приложении Qt?

273
Некорректно работает второй цикл

Некорректно работает второй цикл

Будьте любезны, наведите на путь истинныйВторой цикл while некорректно работает, в чем причина?

305