C++ 运算符重载 >>

标签 c++ operator-overloading

即使存在于任何地方,我也没有找到答案。 我有课,我想要重载 >> 运算符

该代码可以编译,但不能按我想要的方式工作。 我想将值放入数组内的所有单元格中,但它只适用于第一个单元格。看起来我的循环不起作用。

编辑: 完整代码如下。顺便说一句,语言不通,但这是我的作业,老师想要那个名字。

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <cmath>

    template <class T>
    class Wielomian {
    private:
        int stopien;
        T *wspolczynniki;
    public:
        friend std::ostream & operator << (std::ostream &output, Wielomian &w)
        {
            output << "Wielomian: ";
            for (int i = w.stopien-1; i >= 0; i--)
            {
                output << w.wspolczynniki[i] << "x^" << i << " ";
                if (i)
                    output << "+ ";
            }
            return output;
        }
        friend std::istream & operator >> (std::istream &input, Wielomian &w)
        {
            int i = 0;
            do {
                input >> w.wspolczynniki[i++];
            } while (w.stopien < i);
            return input;
        }
        T operator () (T x)
        {
            T wynik = 0;
            for (int i = 0; i < this->stopien; i++)
            {
                wynik += this->wspolczynniki[i] * pow(x,i);
            }
            return wynik;
        }
        T& operator[](const int index)
        {
            return wspolczynniki[index];
        }
        Wielomian operator + (const Wielomian &w)
        {
            const Wielomian *wiekszy;
            const Wielomian *mniejszy;
            if (w.stopien > this->stopien)
            {
                wiekszy = &w;
                mniejszy = this;
            }
            else
            {
                wiekszy = this;
                mniejszy = &w;
            }

            for (int i = 0; i < mniejszy->stopien; i++)
                wiekszy->wspolczynniki[i] += mniejszy->wspolczynniki[i];
            return *wiekszy;
        }
        Wielomian operator - (const Wielomian &w)
        {
            const Wielomian *wiekszy;
            const Wielomian *mniejszy;
            if (w.stopien > this->stopien)
            {
                wiekszy = &w;
                mniejszy = this;
            }
            else
            {
                wiekszy = this;
                mniejszy = &w;
            }

            for (int i = 0; i < mniejszy->stopien; i++)
                wiekszy->wspolczynniki[i] -= mniejszy->wspolczynniki[i];
            return *wiekszy;
        }
        Wielomian operator = (const Wielomian &w)
        {
            this->stopien = w.stopien;
            this->wspolczynniki = new float[this->stopien];
            memcpy(this->wspolczynniki, w.wspolczynniki, w.stopien * sizeof(double));
        }
        Wielomian(const Wielomian &w)
        {
            this->stopien = w.stopien;
            this->wspolczynniki = new float[this->stopien];
            memcpy(this->wspolczynniki, w.wspolczynniki, w.stopien * sizeof(double));
        }
        Wielomian(int stopien = 0, T wspolczynik[] = { 3 })
        {
            this->stopien = stopien;
            wspolczynniki = new T[this->stopien];
            for (int i = 0; i < stopien; i++)
            {
                this->wspolczynniki[i] = wspolczynik[i];
            }
        }
        ~Wielomian()
        {
            free(this->wspolczynniki);
        }

    };



    int main()
    {
        double tab[4] = {3,4,5,6};
        Wielomian<double> w1(4,tab);

        std::cin >> w1;
        std::cout << w1;


        std::cin.get();
        std::cin.get();
        return 0;
    }

最佳答案

你的 while条件 operator >>是错的。在您的代码中:

int i = 0;
do {
  input >> w.wspolczynniki[i++];
} while (w.stopien < i);

i0在开始,然后在 input >> w.wspolczynniki[i++] 之后它是 1 . while条件是 (w.stopien < i)所以如果w.stopien (在你的例子中是 4)比 i 小这是1在第一次迭代中,您将继续循环。但是4 < 1false您将始终只读取一个值。

所以得到你的do-while要工作,您需要将其更改为 (w.stopien > i) .但是当你测试你的索引是否为 i在正确的范围内你不应该使用 do-while一点也不,但是一个while循环。

int i = 0;
while (i < w.stopien) {
  input >> w.wspolczynniki[i++];
}

甚至是 for循环,这将使你在做什么更清楚:

for(int i=0; i< w.stopien; i++) {
  input >> w.wspolczynniki[i];
}

除此之外——以及评论中已经提到的内容——永远不要将不属于一起的内存分配和释放结合起来。如果你使用 new[]那么你必须使用 delete[]释放内存而不是free .

并且不要使用有符号数 ( int ) 作为索引,所以 stopieni应该是无符号的(例如 size_t )。而对于 stopien你应该确保在施工时它是1或更大。

如果你被允许,你应该切换形式 T* wspolczynnikistd::vector<T> wspolczynniki这将使您摆脱复制构造函数、赋值运算符、析构函数,您将不需要 int stopien , and you could simplify other parts of the code using [algorithm](https://en.cppreference.com/w/cpp/algorithm), or at least keep that you normally would use a std::vector`(或其他容器)然后自己进行分配和复制。

关于C++ 运算符重载 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59478578/

相关文章:

c++ - 如何在 C++ 中分配一个二维指针数组

python - 为什么我不能在 Python 中使用 '+' 运算符将元组添加到列表中?

c++ - 如何使用 mysql 连接器 c++ 设置 autoreconnect 选项

c++ - 如何用 cin 分配一个 char 指针?

c++ - 如何在用户数据中存储值类型?

c++ - 摆脱重载的提取运算符? (C++)

c++ - Operator= 除非对象已经初始化,否则重载不起作用

C++ 运算符重载 >= 有 2 个不同的返回值

c++ - 使用转换运算符对两个不同类的对象进行相互转换

c++ - 如何使用 Qt 在 Linux 中读取文件设备?