使用VC8,我创建了两个类似于以下模块的模块:
报头
class IFoo
{
virtual void Bar() = 0;
};模块A
extern IFoo& Foo;
void DoStuff()
{
Foo.Bar();
}模块B
IFoo& Foo = ConcreteFoo();VC8通过将'Foo‘作为指向IFoo的指针来处理这个问题。无论在哪里看到Foo.Bar() (即使在模块B中),它都会删除指针以获取对象的vtable,查找Bar()的地址并调用它。这有点让人恼火,因为Foo实际上是指一个具体的对象,而且总是这样。如果你能做以下这样的事情,那就太好了:
模块A
extern __concrete IFoo& Foo;这将告诉编译器,您承诺提供一个具体的对象来支持此引用。然后,它可以生成对Foo.Bar()的特殊外部引用,并直接调用该方法,而不需要双重取消引用。
据我所知,VisualC++无法做到这一点,这就引出了两个问题:
发布于 2010-02-04 21:46:24
ConcreteFoo()的具体返回类型是什么?如果Foo::Bar()是虚拟的,编译器就不能创建对Foo.Bar()的静态调用,因为Foo的类型在编译时是未知的。如果您知道实际的Foo类型,比如Biz,则可以取消引用:模块A
外向型Biz Foo;
模块B
Biz = ConcreteFoo();
(假设constructor.)有Biz的副本)
https://stackoverflow.com/questions/2203451
复制相似问题