2011-12-26 51 views
0

我有一个通用的(纯虚拟接口)类IFACE,以及​​一些类来处理IFACE的所有子类,如下所示:用class :: factory()实现operator <<;

class IFACE{ 
}; 

class A{ 
public: 
    A& operator<<(IFACE& other);  
}; 

,一切工作正常有以下:

class B:IFACE{ 
}; 

但不能与工厂方法如下:

class C:IFACE{ 
    static C factory(){ 
    C c; 
    return c; 
    } 
} 

具有可执行:

int main(){ 
    A a; 
    B b; 
    C c; 
    C cc = C::factory(); 
    a<<b;    //Ok ... 
    a<<c;    //Also ok... 
    a<<cc;    //Again ok ... 
    a<<C::factory(); //error below 
    return 0; 
} 

error: no match for ‘operator<<’ in ‘A << C::factory()()’

也失败(同样的错误):

a<<(C::factory()); 

现在,以下工作:a<<&(C::factory());但给出了一个关于采取临时地址警告。我认为这是不安全的,因为我无法控制C :: factory()的匿名结果何时超出范围。 这是不安全的吗?

所以我的下一个想法是:

class A{ 
    A& operator<<(IFACE* ifp); 
    template<typename T> 
    A& operator<<(T t){ 
    IFACE* ifp = static_cast<IFACE*>(&t); 
    return (*this)<<ifp; 
    } 
} 

哪个编译罚款,但链接从上面main给出了错误:

undefined reference to 'A& A::operator<< <C>(C)'

这又如何是不确定的?

编辑:

有人建议我实现:

A& A::operator<<(const IFACE& other)

但是,这也将无法编译... 我得到以下错误:

error: passing ‘const IFACE’ as ‘this’ argument of ‘virtual int <some method in IFACE>’ discards qualifiers

更新: 此问题尚未解决。

+0

[香草萨特的 - 最重要的const的候选人](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ )。 – 2011-12-27 00:11:33

+0

@Josh你在'operator <<'中使用的函数必须声明为常量;像这样:'return_type iTYPE :: func()const'。 – 2011-12-27 08:47:28

回答

2

埃塞尔是正确的问题的原因,但不是解决方案。为了解决这个问题,你所要做的就是使参考常数:operator<<(const iFACE&)。现在您的操作员也可以使用临时工。

题外话:而不是做你C c; return c;可以很容易地做return C(),具有相同的结果,但对于编译器和较少可能更容易一行来优化。 :)

+0

啊!你让我想投我自己的答案。无论如何,我正在删除它以防止混淆。 – 2011-12-26 23:57:34

+0

re:_off-topic_:有很多被删除的初始化。编辑(提前发布)。如果iFACE是纯虚拟的,op <<(const iFACE&)如何工作?我得到以下错误:'错误:作为'虚拟int 2011-12-27 00:26:02