Куча коррупции и другие проблемы - PullRequest
0 голосов
/ 06 марта 2020

Я только начал изучать OOP, и у меня есть некоторые проблемы с моим первым проектом. Он не запускается каждый раз, но при запуске отображает правильные значения. Когда он не запускается, кажется, что проблема в куте, жестко я перегружен <<. </p>


#include<iostream>
#include<cmath>

using namespace std;

class Numar_Complex {
    double re, im;
public:
    Numar_Complex() { this->im = 0; this->re = 0; }
    Numar_Complex(Numar_Complex const &n){
            this->re = n.re;
            this->im = n.im;
        }
    ~Numar_Complex() = default;
    double Modul();
    Numar_Complex operator + (Numar_Complex const& obj) {
        Numar_Complex res;
        res.re = this->re + obj.re;
        res.im = this->im + obj.im;
        return res;
    }
    Numar_Complex operator *(Numar_Complex const& obj) {
        Numar_Complex res;
        res.re = this->re * obj.re - this->im * obj.im;
        res.im = this->re * obj.im + this->im * obj.re;
        return res;
    }
    friend ostream& operator <<(ostream& out, Numar_Complex & obj) {
        out << obj.re << " + i * " << obj.im;
        return out;
    }
    friend istream& operator >>(istream& in, Numar_Complex &obj) {
        in >> obj.re >> obj.im;
        return in;
    }
    void operator =(const Numar_Complex& x) {
        this->re = x.re;
        this->im = x.im;
    }
};

class Vector_Complex : public Numar_Complex {
    int len;
    Numar_Complex* v;
public:
    Vector_Complex();
    Vector_Complex(Numar_Complex const &x, int n);
    Vector_Complex(Vector_Complex &w);
    ~Vector_Complex() = default;
    double* Get_VectorOfModules();
    int Get_Len() {
        return len;
    }
    void Sort();
    Numar_Complex Sum_Vector();
    Numar_Complex Prod_Scalar(Vector_Complex const&a, Vector_Complex const&b);
    friend ostream& operator <<(ostream& out, Vector_Complex const& w) {
        out << w.len << "\n";
        for (int i = 0; i < w.len; i++)
            out << w.v[i] << " ";
        return out;
    }
    friend istream& operator >>(istream& in, Vector_Complex & w) {
        in >> w.len;
        for (int i = 0; i < w.len; i++)
            in >> w.v[i];
        return in;
    }
};

int main()
{
    Vector_Complex Vec;
    cin >> Vec;
    cout << Vec << "\n" << "\n";
    double* p = Vec.Get_VectorOfModules();
    int n = Vec.Get_Len();
    for (int i = 0; i < n; i++, p++)
        cout << *p << " ";
    p -= n;
    delete[] p;
    return 0;
}


double Numar_Complex::Modul() {
    return sqrt(this->re * this->re + this->im * this->im);
}

Vector_Complex::Vector_Complex() {
    len = 0;
    v = new Numar_Complex[0];
}

Vector_Complex::Vector_Complex(Numar_Complex const &x, int n) {
    len = n;
    v = new Numar_Complex[n];
    for (int i = 0; i < n; i++)
        v[i] = x;
}

Vector_Complex::Vector_Complex(Vector_Complex &w) {
    len = w.len;
    v = new Numar_Complex[len];
    for (int i = 0; i < len; i++)
        v[i] = w.v[i];
}

double* Vector_Complex::Get_VectorOfModules() {
    double* w = new double[len];
    for (int i = 0; i < len; i++)
        w[i] = v[i].Modul();
    return w;
}

void Vector_Complex::Sort() {

}

Numar_Complex Vector_Complex::Sum_Vector() {
    Numar_Complex s;
    for (int i = 0; i < len; i++)
        s = s + v[i];
    return s;
}

Numar_Complex Vector_Complex::Prod_Scalar(Vector_Complex const& a, Vector_Complex const& b) {
    Numar_Complex prod;
    for (int i = 0; i < a.len; i++)
        prod = prod + a.v[i] * b.v[i];
    return prod;
}

Попробуйте дать импульс 3 1 2 2 5 3 5 Надеюсь, вы можете помочь мне, я пытался исправить этот код в течение 5 часов, и мне не удалось.

1 Ответ

2 голосов
/ 06 марта 2020

Вы по умолчанию создаете объект Vector_Complex, и ваш конструктор по умолчанию делает

Vector_Complex::Vector_Complex() {
    len = 0;
    v = new Numar_Complex[0];
}

Затем вы читаете из потока в объект Vector_Complex, который делает

friend istream& operator >>(istream& in, Vector_Complex & w) {
    in >> w.len;
    for (int i = 0; i < w.len; i++)
        in >> w.v[i];
    return in;
}

Теперь, поскольку объект Vector_Complex создан по умолчанию, переменная v будет указателем на «массив» из zero элементов. Это означает, что w.v[i] будет недействительным для любого значения i. Запись этого (с in >> w.v[i]) приводит к неопределенному поведению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...