实现运算符<< 带有类::工厂();
Implementing operator<< with a class::factory();
我有一个泛型(纯虚拟接口)类IFACE,以及一些处理IFACE所有子类的类,如下所示:
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
更新:
Eser对问题原因的判断是正确的,但对解决方法却不正确。为了解决这个问题,您所要做的就是使引用常数:operator<<(const iFACE&)
。现在你的操作符也可以使用临时值了。
偏离主题:您可以轻松地执行return C()
,而不是执行C c; return c;
,具有相同的结果,但是少了一行,并且可能更容易编译器优化。:)
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 在基类中编写工厂方法
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异