Избегайте определения всех методов в суперклассе, когда мне нужно создавать функторы
Привет,
Смотрите код:
class BaseData { public: BaseData() {} virtual int add() = 0; virtual int multiply() = 0; virtual int click() = 0; virtual int clack() = 0; }; class Derived : public BaseData { int a, b; public: Derived(int a, int b) : BaseData() { this->a = a; this->b = b; } int add() { return a + b; } int multiply() { return a * b; } int click() {return 0;} int clack() {return 0;} }; class Other : public BaseData { int a, b; public: Other(int a, int b) : BaseData() { this->a = a; this->b = b; } int click() { return a + b; } int clack() { return a * b; } int add() {return 0;} int multiply() {return 0;} }; class Operator { int (BaseData::* operation)(); BaseData *obj; public: Operator(BaseData *object, int (BaseData::*op)()) : obj(object) { this->operation = op; } int doOperation() { return (obj->*operation)(); } }; Derived *data1 = new Derived(33, 3); Other *data2 = new Other(50, 2); Operator *o1 = new Operator(data1, &BaseData::add); Operator *o2 = new Operator(data1, &BaseData::multiply); Operator *o3 = new Operator(data2, &BaseData::click); Operator *o4 = new Operator(data2, &BaseData::clack); void setup() { Serial.begin(9600); } int main() { Serial.write(o1->doOperation()); Serial.write(o2->doOperation()); Serial.write(o3->doOperation()); Serial.write(o4->doOperation()); }
Я хотел бы избежать того, чтобы ссылочные методы были объявлены в базовом классе и определены во всех производных классах.
Что я уже пробовал:
Я попытался определить typedef в базовый класс, но безуспешно:
class BaseData { public: typedef int (BaseData::*fx)(); BaseData() {} }; class Derived : public BaseData { int a, b; int _add() { return a + b; } int _multiply() { return a * b; } public: Derived(int a, int b) : BaseData() { this->a = a; this->b = b; } fx add = &Derived::_add; fx multiply = &Derived::_multiply; }
Компилятор вернет эту ошибку
error: cannot convert 'int (Derived::*)()' to 'BaseData::fx {aka int (BaseData::*)()}' in initialization
Есть ли другой способ? Где я ошибаюсь?
0x01AA
Кто заставляет вас определять методы в базовом классе как чисто абстрактные?
Menci Lucio
Дело не в этом. Дело в том, что я не хотел бы определять их в базовом классе... Я думаю, что если я не найду элегантного решения, то определю все методы в базовом классе как не абстрактные.
Stefan_Lang
Ваш запрос не ясен: если вы не хотите определять функции в своем базовом классе, то зачем вам вообще нужен базовый класс?
Чтобы прояснить, чего вы на самом деле хотите, пожалуйста, приведите пример того, как вы собираетесь вызвать одну из этих функций.
P.S.: извините: я только что заметил, что ваш первый блок кода имеет полосу прокрутки - я пропустил код дальше вниз