C++操作员过载>>
C++ Operator Overload >>
即使存在于任何地方,我也没有找到答案。 我有类,我想重载>>运算符
该代码可以编译,但它不能按照我想要的方式工作。 我想在数组内的所有单元格中输入值,但它仅适用于第一个单元格。看起来我的循环不起作用。
编辑: 完整代码如下。顺便说一句,对不起语言,但这是我的家庭作业,老师想要这个名字。
#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;
}
您在operator >>
中的while
条件是错误的。在您的代码中,您有:
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, 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'(或其他容器(,然后自己做分配和复制。
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C 操作员&gt;&gt;与突变器过载