所以我正在开发一个 2D 空间模拟器,我有资源管理器“calc
”来处理所有的所有计算。例如,来自 calc.hpp
:
var calc::eccentricity (object A, object B);
var calc::distance (object A, object B);
var calc::orbitV (object A, object B);
等但是,我构建程序的方式是在我的 calc
类中
private:
object *ship //the currently controlled ship
object *targ //target
object *ref //reference (from which speeds, position, etc. are calculated)
为了使用第一个示例中给出的计算,我为每个计算函数编写了三个函数,如下所示:
var calc::ship_ecc (object A){
if(!ship) //catches null pointers
return NAN;
return eccentricity(*ship, A);
}
var calc::ship_ref_ecc (){
if(!ref) //catches null pointers
return NAN;
return ship_ecc(*ref);
}
var calc::ship_targ_ecc (){
if(!targ) //catches null pointers
return NAN;
return ship_ecc(*targ);
}
eccentricity
,然后是 distance
和 orbitV
。所以我最终每次计算都有四个函数。从calc.hpp
可以看出这会产生大量重复代码。重复的代码是一件坏事。
我的问题是什么
有什么方法可以调用
calc.ship.targ.eccentricity();
calc.ship.ref.eccentricity(); //or variation thereof
或
calc.ship.targ(eccentricity);
calc.ship.ref(eccentricity); //or variation thereof
代替
calc.ship_targ_ecc();
calc.ship_ref_ecc();
?我想知道您是否可以做一些花哨的 operator()
重载,或者传递一个函数,或者在 calc
中创建一个 friend
类。理想情况下,我应该只能访问行 31 - 53
,它们都是 public
。
谢谢!
编辑:得到一个yall的例子:https://ideone.com/jypJQS这是它应该输出的内容以及它现在的工作方式
最佳答案
也许这会改变您当前的代码。但是我认为calc中的函数应该是object的成员。所以你可以这样:
ship.eccentricity(target);
让我感到困惑的(这可能是这里的大问题)是您似乎在您的 calc 对象(私有(private)成员)中定义了一些硬关系。那些是干嘛的?从代码中,我猜每个“船”都有一个 calc 对象。如果是,那么将代码添加到对象而不是在对象和计算之间保持 1-1 关系将是另一个原因。
关于c++ - 减少重复的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024640/