【发布时间】:2012-12-24 18:32:17
【问题描述】:
所以我正在开发一个 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成为我的计算资源经理,如果你是这个意思的话