首页 > 解决方案 > 如何用两个指针初始化类的对象?

问题描述

好的,所以我知道这是基本的,但我不明白我在这里做错了什么。这是课程:

class numar_complex {
    friend std::ostream& operator<<(std::ostream& out, const numar_complex& numar_complex);
    friend std::istream& operator>>(std::istream& is, numar_complex& numar_complex);

private:
    double* p_real;
    double* p_imaginar;

public:
    //constructor, destructor:
    numar_complex()
    {

        double* p_real{ new double(0.0) };

        double* p_imaginar{ new double(0.0) };

        cout << "constructor" << endl;
    }
    numar_complex(const numar_complex& nr)
    {
        if (p_real != nullptr) {
            p_real = nullptr;
            delete p_real;
        }
        p_real = new double(*nr.p_real);
        if (p_imaginar != nullptr) {
            p_imaginar = nullptr;
            delete p_imaginar;
        }
        p_imaginar = new double(*nr.p_imaginar);
        cout << "copy constructor " << endl;
    }
    ~numar_complex()
    {
        p_real = nullptr;
        delete p_real;
        p_imaginar = nullptr;

        delete p_imaginar;

        cout << "destructor" << endl;
    }

    // getteri:

    double get_p_real()
    {
        return *p_real;
    }
    double get_p_imaginar()
    {
        return *p_imaginar;
    }
    //setteri:

    void set_p_real(double x)
    {
        p_real = nullptr;
        delete p_real;
        p_real = new double(x);
    }
    void set_p_imaginar(double x)
    {
        p_imaginar = nullptr;
        delete p_imaginar;
        p_imaginar = new double(x);
    }
    std::ostream& operator<<(std::ostream& out, const numar_complex& numar_complex)
    {
        if (*numar_complex.p_imaginar >= 0) {
            out << *numar_complex.p_real << "+" << *numar_complex.p_imaginar << "*i \n";
        }
        else if (*numar_complex.p_imaginar < 0) {
            out << *numar_complex.p_real << *numar_complex.p_imaginar << "*i \n";
        }

        return out;
    }

并且由于某种原因,当我简单地声明这个类的一个对象时,

numar complex x; 
cout << x;

它崩溃(内存问题);但是,如果我使用 setter/getter,问题就不会再出现了。如果是

numar complex x; 
x.set_p_real(1); 
x.set_p_imaginar(1); 
cout << x;

将导致 1 + 1i;
PS:如果我不使用 setter 来初始化值,getter 也会导致崩溃。

标签: c++ooppointers

解决方案


在你不初始化的构造函数p_realp_imaginar,你声明了新的变量,这些变量只存在于构造函数的范围内,因此被破坏,导致内存泄漏。

为避免这种情况,我建议使用成员初始化器列表

class complex
{
private:
    double* p_real;
    double* p_imaginar;

public:
    numar_complex():
       p_real(new double(0.0)),
       p_imaginar(new double(0.0))
    {
        cout << "constructor" << endl;
    }

    .
    .
    .
    .
    //the rest
}

推荐阅读