История изменений
Исправление alysnix, (текущая версия) :
вот примерно как оно должно выглядеть. на первый взгляд
class Figure {
public:
enum Kind {f1, f2, f3, max_fig};
protected:
Kind _kind{f1};
public:
explicit Figure (Kind fkind):_kind(fkind) {}
Kind get_kind() const {return _kind;}
};
//==========================================
///некая фигура
class F1: public Figure {
public:
F1():Figure(f1) {}
};
///еще фигура
class F2: public Figure {
public:
F2():Figure(f2) {}
};
//==========================================
class Collider {
using cFigure = const Figure; ///для краткости
using CollisionFun = bool (cFigure& ff, cFigure& fff);
///массив функций столкновений
CollisionFun* _funcs [Figure::max_fig] [Figure::max_fig] = {};
public:
Collider() {
///заполнить массив функций
}
///найти функцию
CollisionFun* get_collision_fun (cFigure::Kind fk, cFigure::Kind fkk) const {
return _funcs [fk][fkk];
}
///проверить столкновение
bool check_collision(cFigure& ff, cFigure& fff) {
auto lfun = get_collision_fun(ff.get_kind(), fff.get_kind());
return lfun(ff, fff);
}
};
void test () {
F1 lf;
F2 lff;
Collider lcl;
auto lcollision = lcl.check_collision(lf, lff);
}
предлагаю растаманам написать эквивалетный код на русте, чтобы сравнить размер и читабельность. но не требую. колхоз - дело добровольное
Исправление alysnix, :
вот примерно как оно должно выглядеть. на первый взгляд
class Figure {
public:
enum Kind {f1, f2, f3, max_fig};
protected:
Kind _kind{f1};
public:
explicit Figure (Kind fkind):_kind(fkind) {}
Kind get_kind() const {return _kind;}
};
//==========================================
///некая фигура
class F1: public Figure {
public:
F1():Figure(f1) {}
};
///еще фигура
class F2: public Figure {
public:
F2():Figure(f2) {}
};
//==========================================
class Collider {
using cFigure = const Figure; ///для краткости
using CollisionFun = bool (cFigure& ff, cFigure& fff);
///массив функций столкновений
CollisionFun* _funcs [Figure::max_fig] [Figure::max_fig] = {};
public:
Collider() {
///заполнить массив функций
}
///найти функцию
CollisionFun* get_collision_fun (cFigure::Kind fk, cFigure::Kind fkk) const {
return _funcs [fk][fkk];
}
///проверить столкновение
bool check_collision(cFigure& ff, cFigure& fff) {
auto lfun = get_collision_fun(ff.get_kind(), fff.get_kind());
return lfun(ff, fff);
}
};
void test () {
F1 lf;
F2 lff;
Collider lcl;
auto lcollision = lcl.check_collision(lf, lff);
}
Исходная версия alysnix, :
вот примерно как оно должно выглядеть. на первый взгляд
class Figure {
public:
enum Kind {f1, f2, f3, max_fig};
protected:
Kind _kind{f1};
public:
explicit Figure (Kind fkind):_kind(fkind) {}
Kind get_kind() const {return _kind;}
};
//==========================================
///некая фигура
class F1: public Figure {
public:
F1():Figure(f1) {}
};
///еще фигура
class F2: public Figure {
public:
F2():Figure(f2) {}
};
//==========================================
class Collider {
using cFigure = const Figure; ///для краткости
using CollisionFun = bool (cFigure& ff, cFigure& fff);
///массив функций столкновений
CollisionFun* _funcs [Figure::max_fig] [Figure::max_fig] = {};
public:
Collider() {
///заполнить массив функций
}
///найти функцию
CollisionFun* get_collision_fun (cFigure::Kind fk, cFigure::Kind fkk) const {
return _funcs [fk][fkk];
}
///проверить столкновение
bool check_collision(cFigure& ff, cFigure& fff) {
auto lfun = get_collision_fun(ff.get_kind(), fff.get_kind());
return lfun(ff, fff);
}
};
void test () {
F1 lf;
F2 lff;
Collider lcl;
auto lcollision = lcl.check_collision(lf, lff);
}