我一直缺少std :: complex的一些重要功能,就像添加std :: complex< float>和std :: complex< double>或像c这样的操作,即在int和std :: complex之间.我的想法是从std :: complex导出一个新类my :: complex,它只是继承了已经实现的一切,并添加了其他的东西.
为了使代码与使用std :: complex的函数兼容,我添加了自动转换到和从std :: complex(以及my :: complex< float>和my :: complex< double>之间的自动转换).
现在就像
my::complex<float> c1,c2,c3; c1 = c2 + c3;
即使我没有实现自己的操作,因为c2和c3被转换为std :: complex,并且结果被转回到我的:: complex中.我假设编译器可以优化任何实际的复制.
但是,以下内容不起作用:
c1 = 2*(c2+c3)
因为std :: complex不能乘以一个整数(如果我乘以一个double并且具有复杂的< float> s,那么同样的问题).
我以为“好的,似乎我必须添加运算符”,但是如果我这样做,我使用重载运算符“是不明确的,因为编译器可以在std :: complex和my :: complex之间隐含.
解决方法
为了添加不同类型的复数和其他运算符,我将使用免费函数
std::complex<double> operator? (std::complex<double> a,std::complex<float> b){ std::complex<double> result; // implement ? return result; } std::complex<double> operator? (std::complex<float> a,std::complex<double> b){ return b ? a; }
在哪里?是您想拥有的运算符的地点.请注意,这是一个前C 11解决方案,更好的方式见Jerry Coffins answer.
为了在一个复合体中添加一个数字,像在1 c中,我不会努力编写一个运算符,而只是简单地使用c 1(实际上我不知道这是否适用于std :: complex,但是如果不).这就是操作人员的一般工作,人们习惯了.
另外我会小心继承自std类.只要有可能,我宁愿组合继承,以避免不可预见的并发症.标准课程是经过深思熟虑的,只是太容易弄错了.