LINUX.ORG.RU

История изменений

Исправление 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);
}