即使在任何地方都没有找到答案。 我上课了,我想重载>>运算符
该代码可以编译,但是不能按我的要求运行。 我想将值放在数组内的所有单元格中,但它仅适用于第一个单元格。看来我的循环无效。
编辑: 完整代码如下。顺便说一句,对语言感到抱歉,但这是我的作业,老师想要这个名字。
#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;
}
答案 0 :(得分:2)
您在while
中的operator >>
条件是错误的。在您的代码中,您具有:
int i = 0;
do {
input >> w.wspolczynniki[i++];
} while (w.stopien < i);
i
开头是0
,然后在input >> w.wspolczynniki[i++]
之后是1
。 while
条件为(w.stopien < i)
,因此如果w.stopien
(在您的示例中为4
)更小,则第一个i
为1
迭代,您将继续循环。但是4 < 1
是false
,您将永远只读取一个值。
因此,使您的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
),因此stopien
和i
应该是无符号的(例如size_t
)。对于stopien
,您应确保在构造上1
或更大。
如果允许的话,您应该将格式T* wspolczynniki
切换为std::vector<T> wspolczynniki
,这样就可以摆脱复制构造函数,赋值运算符,析构函数,您不需要int stopien { {1}} std :: vector`(或其他容器),然后进行分配和自己复制。