如何用两个指针初始化类的对象?

Posted

技术标签:

【中文标题】如何用两个指针初始化类的对象?【英文标题】:how to initialize object of class with two pointers? 【发布时间】:2021-08-25 10:34:56 【问题描述】:

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

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也会导致crash。

【问题讨论】:

这不能回答你的问题,但也许考虑使用std::complex?或者至少是另一个库类? 在您的构造函数中,您创建 local 变量,这些变量在构造函数完成后立即被丢弃。此构造函数未初始化成员变量。 你为什么还要使用指针? 你需要在一个指针上调用delete,然后将它设置为nullptr。 显示的代码中没有任何内容需要使用指针。它只会使显示的代码比它需要的大两倍,而且更容易出错。通过用普通的doubles 替换指针,显示的代码将是当前大小的一半。无需复制构造函数。不需要赋值运算符(缺少一个)。没有机会制造简单的错误,例如尝试删除空指针。这种错误被称为“无意义的使用指针”。 【参考方案1】:

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

为避免这种情况,我建议使用member initializer lists

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

【讨论】:

以上是关于如何用两个指针初始化类的对象?的主要内容,如果未能解决你的问题,请参考以下文章

将两个指针的值相加并将相加保存到另一个指针中

C++之对象成员指针

c语言的二级指针如何初始化了?

在指针方法 Go 中初始化指针接收器

C++ 初始化作为对象指针容器的成员变量

在c中初始化双指针的正确方法是啥