我想知道解决以下问题的最有效率(关于速度)方法:
我们假设我们有一个班级AFoo
,有一个简单的头文件:
AFoo.h
class AFoo {
public:
double x;
//Additional methods/variables belonging only to AFoo
};
现在,我收到了一组我没有定义的类(即其他一些顽固的程序员正在创建这些类),所有这些都是"分享" x
变量。我们可以想象这样的集合中的一个成员是类BFoo
,它看起来像:
BFoo.h
class BFoo {
public:
double x;
//Additional methods/variables belonging only to BFoo
};
现在,我在某个地方有一个接受指向AFoo
void doSomething(AFoo *pnt){
//does operations with the x member only.
}
我真的希望我的doSomething
函数也接受指向BFoo
或我给定的集合的任何类的指针。将x
抽象为新的类Foo
并不是解决办法,因为顽固的程序员拒绝继承它。我想过使用模板函数,但不方便的是每次顽固的程序员创建一个新类时我都要重新编译。
我的第一次尝试是定义一个行为如下的接口:
class AlternativeFoo {
public:
virtual double & getX() = 0;
};
所以我可以定义另一个类,如
class AlternativeAFoo: public AlternativeFoo{
public:
double & getX(){ return mPoint.x; };
private:
APoint mPoint;
};
现在我可以更改doSomething
方法以接受指向AlternativeFoo
变量的指针,该指针工作正常。但是,此解决方案明显慢于模板类。我是否缺少一种不会影响性能的设计模式?非常感谢你!
编辑:
作为问题的一个具体例子,想象一下我编写一个我希望与同一抽象概念的几个定义兼容的库,例如,一个具有坐标x和y的2D点。这个定义可以来自视频游戏设计软件中的API或其他任何东西,并且它们都共享它们具有x
和y
坐标作为相同类型的成员变量的事实。如何使一段代码与所有代码兼容?
答案 0 :(得分:1)
您只需要一个在pnt->x
(或其他)上运行的模板。
即
template <typename AnyFoo>
void doSomething(AnyFoo * pnt)
{
pnt->x = 10;
}
如果您尝试doSomething("Something not a Foo e.g. a const char *")