在c++中寻找复数类的设计模式

ncgqoxb0  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在使用复数来学习设计模式。我目前正在使用一个抽象类:

namespace abstract{
    class complex{
        public:
            virtual ~complex() = 0;
            virtual double re() const = 0;
            // some other virtual function
    };    
};

namespace cartesian{
    class complex : public abstract::complex{
        public:
            complex(){}
            ~complex(){}
            double re() const override{return re_;};
            //... other functions
        private:
             double re_;
             double im_;

            // other
        
    };

};

namespace polar{
    class complex{
        /// polar complex numbers....
    };
};

我希望能够写在主要:

cartesian::complex c(1,2);
polar::complex p(3,PI);
exponential::complex q = exp(c) + p;
print(q)

问题是我必须为每个类写很多赋值操作符,并带有forward声明。那么有没有办法让复杂类的所有表示都是相同类型的,只是有不同的构造函数呢?比如pimpl,每个实现都有不同的指针,或者我不知道模板。

2skhul33

2skhul331#

此 任务 没有 通用 的 设计 模式 。
多态 性 对 我 来说 不 是 一 种 设计 模式 , 它 是 C + + 语言 不可 分割 的 一 部分 。
当然 , 很 明显 C + + 中 已经 有 了 所有 的 东西 。 所以 , 你 已经 知道 std::complex 了 。 我 不 确定 你 是否 知道 std::literals::complex_literals 。 有 了 它 , 你 可以 写 一些 直观 的 东西 , 比如 :

#include <iostream>
#include <complex>
 
int main()
{
    using namespace std::complex_literals;
    std::complex<double> c = 1.0 + 1i;
    std::cout << "abs" << c << " = " << std::abs(c) << '\n';
    std::complex<float> z = 3.0f + 4.0if;
    std::cout << "abs" << z << " = " << std::abs(z) << '\n';
}

中 的 每 一 个
示例 摘自 CPP 参考 文件
您 可以 选择 复数 的 一 种 表示 形式 , 然后 将 所有 其他 形式 转换 为 它 。 这样 , 您 就 可以 使用 一 种 数据 类型 执行 所有 操作 。
你 唯一 需要 集成 的 就是 更多 的 构造 函数 和 赋值 运算 符 , 但 最 好 使用 复杂 文字 。
所以 , 我 的 建议 是 。 不要 使用 多态 。 对于 这个 任务 来说 , 它 太 复杂 , 太 慢 。
请 考虑 一下 。
出于 教学 的 目的 , 你 当然 可以 实现 你 的 解决 方案 。 为此 , 使用 自 定义 的 文字 或 解析 器 ...

相关问题