提问人:john 提问时间:4/19/2021 最后编辑:Vlad from Moscowjohn 更新时间:4/19/2021 访问量:319
如何在 c++ 中为 2 指针变量制作复制构造函数?
How do i make copy constructor for 2 pointer variable in c++?
问:
我有两个指针变量作为数据成员。如何制作这两个数据成员的副本?如何为此制作一个深度复制构造函数?我试了很多次,但没有用。
class abc {
float *number1;
float *number2;
public:
abc(float l,float w)
{
number1 = new float;
number2 = new float;
number1 = &l;
number2 = &w;
}
float get_1()
{
return *number1;
}
float get_2()
{
return *number2;
}
abc(const abc& ob)
{
number1 = ob.number1;
number2 = ob.number2;
}
void display()
{
cout << "Number 1 : " << *number1 << endl;
cout << "Number 2 : " << *number2 << endl;
}
};
答:
0赞
ravenspoint
4/19/2021
#1
void display()
{
cout<<"Number 1 : "<<number1<<endl;
cout<<"Number 2 :"<<number2<endl;
}
这将打印数字内存中的位置。这是你想要的吗?显示数字的值
void display()
{
cout<<"Number 1 : "<< *number1 << endl;
cout<<"Number 2 : "<< *number2 << endl;
}
评论
1赞
unalignedmemoryaccess
4/19/2021
这不是一个真正的答案。他想以正确的方式复制数据,所以新的分配和复制。
1赞
unalignedmemoryaccess
4/19/2021
我没有给你负面的反馈,但我想指出,问他想要什么并不是那么的回答:)我宁愿在可能的情况下给予积极的反馈,而在可能的情况下什么都不做。
2赞
mch
4/19/2021
#2
此外,您的构造函数是错误的:
abc(float l,float w)
{
number1= new float;
number2=new float;
number1 =&l; //this will overwrite the pointer returned by new with the address of a local variable
number2=&w; //the same
}
您应该这样做:
abc(float l,float w)
{
number1= new float(l); // allocate a float and set the value to l
number2=new float(w); // allocate a float and set the value to w
}
复制构造函数非常相似:
abc(const abc& ob)
{
number1 = new float(*ob.number1); // allocate a float and set the value to number1 from the other object
number2 = new float(*ob.number2); // allocate a float and set the value to number2 from the other object
}
此示例可以通过使用构造函数的初始值设定项列表来进一步改进:
abc(float l,float w) :
number1 { new float(l)},
number2 { new float(w)}
{
}
abc(const abc& ob) :
number1 { new float(*ob.number1)},
number2 { new float(*ob.number2)}
{
}
评论
2赞
MikeCAT
4/19/2021
你的意思是而不是?(也用于new float(*ob.number1)
new float(ob.number1)
number2
)
0赞
Ted Lyngmo
4/19/2021
@john 如果你要对答案提供反馈,你最好更准确。“不工作”并不能提供任何关于什么是不工作的见解。
2赞
Vlad from Moscow
4/19/2021
#3
对于初学者来说,这个构造函数
abc(float l,float w)
{
number1 = new float;
number2 = new float;
number1 = &l;
number2 = &w;
}
产生内存泄漏。起初,在这些语句中分配了一个内存
number1 = new float;
number2 = new float;
它的地址被分配给指针。但随后指针立即被重新分配
number1 = &l;
number2 = &w;
因此,分配的内存的地址丢失了。
构造函数至少可以按以下方式查看
abc( float l, float w ) : number1( new float( l ) ), number2( new float( w ) )
{
}
这些函数
float get_1()
{
return *number1;
}
float get_2()
{
return *number2;
}
应该像这样声明
float get_1() const
{
return *number1;
}
float get_2() const
{
return *number2;
}
一般来说,最好定义这些函数,例如
const float & get_1() const
{
return *number1;
}
const float & get_2() const
{
return *number2;
}
float & get_1()
{
return *number1;
}
float & get_2()
{
return *number2;
}
复制构造函数可能如下所示
abc( const abc &ob)
: number1( new float( *ob.number1 ) ), number2( new float( *ob.number2 ) )
{
}
函数显示至少应看起来像
void display() const
{
cout << "Number 1 : " << *number1 << endl;
cout << "Number 2 : " << *number2 << endl;
}
您可以定义一个友元运算符<<而不是此函数。例如
class abc
{
//...
friend std::ostream & operator <<( std::ostream &os, const abc &ob )
{
os << "Number 1 : " << *ob.number1 << std::endl;
os << "Number 2 : " << *ob.number2 << std::endl;
return os;
}
}
此外,还应显式定义复制赋值运算符和析构函数。
评论
float
float number1; float number2;
new
new