如何在 c++ 中为 2 指针变量制作复制构造函数?

How do i make copy constructor for 2 pointer variable in c++?

提问人:john 提问时间:4/19/2021 最后编辑:Vlad from Moscowjohn 更新时间:4/19/2021 访问量:319

问:

我有两个指针变量作为数据成员。如何制作这两个数据成员的副本?如何为此制作一个深度复制构造函数?我试了很多次,但没有用。

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;
    }
};
C++ 指针 复制构造函数 定义

评论

1赞 unalignedmemoryaccess 4/19/2021
John,让我们先从代码对齐开始。然后阅读以下内容:learncpp.com/cpp-tutorial/shallow-vs-deep-copying
0赞 Ted Lyngmo 4/19/2021
为什么要动态分配两个 s 而不是:而不必打扰?floatfloat number1; float number2;
1赞 MikeCAT 4/19/2021
@TedLyngmo......并用无意义的本地指针覆盖指针,导致内存泄漏?
1赞 πάντα ῥεῖ 4/19/2021
@john但你绝对不需要那里。new
2赞 Ted Lyngmo 4/19/2021
@john 您是否一直在使用另一种语言进行编程,其中使用是正确的方法?new

答:

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;
    }
}

此外,还应显式定义复制赋值运算符和析构函数。