我会尽力解释我能解决的问题:
我有一类Polinomio(西班牙语的多项式)。它有一个Monomio(Monomial)类的向量。
在Polinomio我有这个方法:
void Polinomio::rellenarRandom() {
Monomio mon;
vector<Monomio> vec (getGrado() + 1, mon);
for (int i = 0; i <= getGrado(); i++) {
int random = MIN + (rand() % (int)(MAX - MIN + 1));
Monomio mon (random, i);
vec[i] = mon;
}
cout << vec[0] << endl;
cout << vec[1] << endl;
cout << vec[2] << endl;
cout << vec[3] << endl;
cout << vec[4] << endl;
setMonomio(vec);
}
它用随机Monomials填充矢量vec,然后它将vetor“Monomio”(坏名字,我知道)设置为这个随机向量。
cout使这个输出(它变化,但是一个例子):
setter非常简单:
void Polinomio::setMonomio(vector<Monomio> vec) {
this->monomios = vec;
}
主要是我:
Polinomio pol (5); // Creates a Polinomial with grade 5
pol.rellenarRandom();
cout << "pol: " << pol << endl;
那个cout做了这个输出:
pol:3473744x ^ 0 + -69x ^ 1 + 28x ^ 2 + -78x ^ 3 + -53x ^ 4 + -9x ^ 5 +
我多次测试,试图检测错误,但似乎没有模式。第一个数字每次都不同,但从来都不是。
这不是&lt;&lt;的重载问题。在Polinomo类上,因为我还测试了对该元素的另一个访问,并且它“正确地”显示它(相同,即使它不是它应该的那样)。
问题必须出在设定者身上,但我无法弄清问题是什么。
感谢您的帮助!
编辑:(修改了setMonomio错误的setter名称
我又添加了一个测试,它让我疯狂。这就是我所做的:
我在设置之前修改了这个cout,看到给我带来问题的成员:
cout&lt;&lt; “VEC:”; cout&lt;&lt; vec [0]&lt;&lt; ENDL;
setMonomios(VEC);
在setMonomios中,我修改了setMonomios:
void Polinomio :: setMonomios(vector vec){ cout&lt;&lt; “set:”&lt;&lt; vec [0]&lt;&lt; ENDL; this-&gt; monomios = vec; cout&lt;&lt; “postset:”&lt;&lt; this-&gt; monomios [0]&lt;&lt; ENDL; }
结果:
那么,当我打电话给setter时,勇气会以某种方式被修改?
答案(编辑你已经要求):
Tony Jiang:
这样做了,结果是(只有第一个元素,才会产生问题): * VEC:0x ^ 0 *设置:3670352x ^ 0 * postset:3670352x ^ 0
Wolfgang.Finkbeiner:
&lt;&lt;运算符重载:
inline ostream& operator<< (ostream& o, const Polinomio &a) {
auto v = a.getMonomios();
for (vector<Monomio>::iterator it = v.begin(); it != v.end(); ++it)
o << *it << " + ";
return o;
}
DOUGLAS O. MOEN
getGrado总是返回相同的值。我不使用vector.size()的原因是因为在其他一些函数中我在初始化向量之前使用它,或者在修改它时使用它,所以如果我这样做会产生意想不到的结果。无论如何,经过测试,它没有任何问题。
PaulMcKenzie
我不知道你的复制语义究竟是什么意思,但无论如何,我会发布它:
#include "Monomio.h"
Monomio::Monomio() {
coeficiente = 0;
exponente = 0;
}
Monomio::Monomio(int coef) {
coeficiente = coef;
exponente = 0;
}
Monomio::Monomio(int coef, int exp) {
coeficiente = coef;
exponente = exp;
}
Monomio::Monomio(const Monomio& orig) {
}
Monomio::~Monomio() {
}
//Getters & Setters:
int Monomio::getCoeficiente() const {
return coeficiente;
}
int Monomio::getExponente() const {
return exponente;
}
void Monomio::setCoeficiente(int c) {
this->coeficiente = c;
}
void Monomio::setExponente(int e) {
this->exponente = e;
}
R Sahu
MCVE(可能不完全是Minimal,但它是一个小项目):
除了Monomio(上面发布的)重播之外你可能需要:
Polinomio班:
#include "Polinomio.h"
Polinomio::Polinomio() {
setGrado(0);
setMonomios(vector<Monomio> (0));
srand (time(NULL));
}
Polinomio::Polinomio(const Polinomio& orig) {
setGrado(orig.getGrado());
setMonomios(orig.getMonomios());
srand (time(NULL));
}
Polinomio::Polinomio(int grado) {
setGrado(grado);
cout << "grado:" << getGrado() << endl;
Monomio mon;
setMonomios(vector<Monomio> (getGrado() + 1, mon));
srand (time(NULL));
}
Polinomio::~Polinomio() {
}
int Polinomio::getGrado() const {
return this->grado;
}
vector<Monomio> Polinomio::getMonomios() const {
return this->monomios;
}
void Polinomio::rellenarRandom() {
Monomio mon;
vector<Monomio> vec (getGrado() + 1, mon);
for (int i = 0; i <= getGrado(); i++) {
// int random = MIN + (rand() % (int)(MAX - MIN + 1));
int random = 1 + i;
Monomio mon (random, i);
vec[i] = mon;
}
cout << "VEC :";
cout << vec[0] << endl;
setMonomios(vec);
auto v = monomios;
cout << "V: ";
cout << v[0] << endl;
}
void Polinomio::rellenarRandom(int grado) {
}
void Polinomio::setGrado(int grado) {
this->grado = grado;
}
void Polinomio::setMonomios(vector<Monomio> vec) {
cout << "set: " << vec[0] << endl;
this->monomios = vec;
cout << "postset: " << this->monomios[0] << endl;
}
和Header文件(主要针对运营商,但如果你看到任何奇怪的东西请告诉我):
#ifndef POLINOMIO_H
#define POLINOMIO_H
#include "Monomio.h"
class Polinomio {
int grado;
public: vector<Monomio> monomios;
public:
Polinomio();
Polinomio (int grado);
Polinomio(const Polinomio& orig);
virtual ~Polinomio();
int getGrado () const;
void setGrado (int grado);
void rellenarRandom ();
void rellenarRandom (int grado);
vector<Monomio> getMonomios () const;
void setMonomios (vector<Monomio> vec);
private:
const int MAX = 100;
const int MIN = -100;
};
//Operators:
inline ostream& operator<< (ostream& o, const Polinomio &a) {
auto v = a.getMonomios();
for (vector<Monomio>::iterator it = v.begin(); it != v.end(); ++it)
o << *it << " + ";
return o;
}
inline Polinomio operator+(const Polinomio &a, const Polinomio &b) {
}
inline Polinomio operator-(const Polinomio &a, const Polinomio &b) {
}
inline Polinomio operator*(const Polinomio &a, const Polinomio &b) {
}
#endif /* POLINOMIO_H */
#ifndef MONOMIO_H
#define MONOMIO_H
#include <cstdlib>
#include <stdlib.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <iomanip>
using namespace std;
class Monomio {
int coeficiente;
int exponente;
public:
Monomio();
Monomio(int coef);
Monomio(int coef, int exp);
Monomio(const Monomio& orig);
int getCoeficiente() const;
int getExponente() const;
void setExponente(int e);
void setCoeficiente(int c);
virtual ~Monomio();
private:
};
//Operators:
inline ostream& operator<< (ostream& o, const Monomio &a) {
o << a.getCoeficiente() << "x^" << a.getExponente();
return o;
}
inline Monomio operator+(const Monomio &a, const Monomio &b) {
Monomio res;
if (a.getExponente() != b.getExponente())
throw "Suma de monomios con exponente diferente!";
else {
res = Monomio (a.getCoeficiente() + b.getCoeficiente(), a.getExponente());
}
return res;
}
inline Monomio operator-(const Monomio &a, const Monomio &b) {
Monomio res;
if (a.getExponente() != b.getExponente())
throw "Suma de monomios con exponente diferente!";
else {
res = Monomio (a.getCoeficiente() - b.getCoeficiente(), a.getExponente());
}
return res;
}
inline Monomio operator*(const Monomio &a, const Monomio &b) {
Monomio res = Monomio (a.getCoeficiente() * b.getCoeficiente(), a.getExponente() + b.getExponente());
return res;
}
#endif /* MONOMIO_H */
Plus:我使用的主文件(我还为Monomio做了一些测试:
#include "Polinomio.h"
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
Monomio a (2, 2);
Monomio b (3, 5);
Monomio c (3, 2);
cout << a << " + " << c << " = " << a + c << endl;
cout << a << " - " << c << " = " << a - c << endl;
cout << a << " * " << b << " = " << a * b << endl;
Polinomio pol (5);
pol.rellenarRandom();
cout << "pol: " << pol << endl;
cout << "primero: " << pol.getMonomios().at(0);
return 0;
}
答案 0 :(得分:3)
Monomio::Monomio(const Monomio& orig) {
}
我不了解你,但这个功能对我来说不对。
(是的,这是错误)
this->monomios = vec;
这使得monomios
等于&#34;值&#34; vec
,表示它复制了所有Monomio
个对象。它使用您编写的复制构造函数进行复制。您编写的复制构造函数根本没有为正在构造的Monomio
对象分配任何内容,因此它们正在获取恰好位于内存中的值。通常,巧合的是,它碰巧是另一个向量的价值。有时它不是。