如何用两个指针初始化类的对象?
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。 显示的代码中没有任何内容需要使用指针。它只会使显示的代码比它需要的大两倍,而且更容易出错。通过用普通的double
s 替换指针,显示的代码将是当前大小的一半。无需复制构造函数。不需要赋值运算符(缺少一个)。没有机会制造简单的错误,例如尝试删除空指针。这种错误被称为“无意义的使用指针”。
【参考方案1】:
在构造函数中你没有初始化p_real
和p_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
【讨论】:
以上是关于如何用两个指针初始化类的对象?的主要内容,如果未能解决你的问题,请参考以下文章