c – 有没有一个很好的方式来扩展一个类与额外的运算符?

前端之家收集整理的这篇文章主要介绍了c – 有没有一个很好的方式来扩展一个类与额外的运算符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直缺少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中的所有内容,并抛出继承权?

解决方法

为了添加不同类型的复数和其他运算符,我将使用免费函数
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类.只要有可能,我宁愿组合继承,以避免不可预见的并发症.标准课程是经过深思熟虑的,只是太容易弄错了.

猜你在找的C&C++相关文章