具有奇怪数据的向量的第一个元素

First Element of vector with weird data

我会尽力解释问题:

我有一个 class Polinomio(西班牙语中的多项式)。具有 class Monomio(单项式)的矢量。

在 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);
}

它用随机单项式填充向量 vec,然后将向量 "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 +

我测试了很多次,试图找出错误,但似乎没有规律可循。第一个数字每次都不一样,但从来都不是应该的。

这不是 Polinomo class 上 << 过载的问题,因为我还测试了对该元素的另一个访问,它显示了 "correctly"(相同,即使它是不是它应该的)。

问题肯定出在setter,但我想不通是什么问题。

感谢您的帮助!

编辑:(将错误的 setter 名称修改为 setMonomio

我又添加了一项测试,这让我抓狂。这就是我所做的:

  1. 我在set之前修改了这个cout,看给我出问题的成员:

    cout << "VEC :"; cout << vec[0] << endl;

    setMonomios(vec);

  2. 在setMonomios中,我修改了setMonomios:

    void Polinomio::setMonomios(vector vec) { cout << "set: " << vec[0] << endl; 这个->monomios = vec; cout << "postset: " << this->monomios[0] << endl; }

结果:

所以,当我调用 setter?

时,勇气得到了某种修改

答案(您要求的编辑):

江东:

这样做了,结果是(只有第一个元素,出现问题): * VEC:0x^0 * 设置:3670352x^0 * post设置:3670352x^0

Wolfgang.Finkbeiner:

<< 运算符重载:

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;
}

道格拉斯·莫恩

getGrado 总是 return 相同的值。我不使用 vector.size () 的原因是因为在一些其他函数中我在初始化向量之前或修改它时使用它,所以如果我这样做可能会产生意想不到的结果。反正已经测试过了,没问题。

保罗·麦肯齐

我不知道你所说的复制语义到底是什么意思,但无论如何,我会 post 它:

#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萨胡

MCVE(可能不完全是 Minimal,但它是一个小项目):

除了要重现的 class Monomio(posted)之外,您可能需要:

class 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;
}

和头文件(主要针对操作员,但如果你看到任何奇怪的东西请告诉我):

#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 */

加上:我使用的主文件(我也为 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;
}
Monomio::Monomio(const Monomio& orig) {
}

我不了解你,但我觉得那个函数不对。

(是的,这就是错误)

this->monomios = vec;

这使得 monomios 等于 vec 的 "value",这意味着它复制了所有 Monomio 对象。它使用您编写的复制构造函数制作副本。您编写的复制构造函数根本没有为正在构造的 Monomio 对象分配任何内容,因此它们获取的值恰好在内存中。通常,巧合的是,它恰好是另一个向量的值。有时不是。