C ++,Copy Constructor在字符数组中无法正常工作

时间:2013-11-23 17:33:22

标签: c++ arrays pointers constructor copy

这是代码,我创建了一个包含另一个类的对象的类。我得到错误的输出,即垃圾值..我无法弄清楚什么是问题。

突出显示的行,s输出给出了垃圾值,但编译时没有错误。一直在使用MS Visual Studio 2010

#include<iostream>
#include<conio.h>
#include<string>
#include<cstring>
using namespace std;

class Address
{
char *street_no,*house_no,*city,*code;

public:

    **Address(Address &obj)
{

    int size;
    cout<<obj.street_no;
    size=strlen(obj.street_no);

    street_no=new char[size+1];
    strcpy(street_no,obj.street_no);

    size=strlen(obj.house_no);
    house_no=new char[size+1];
    strcpy(house_no,obj.house_no);
    size=strlen(obj.city);
    city=new char[size+1];
    strcpy(city,obj.city);
    size=strlen(obj.code);
    code=new char[size+1];
    strcpy(code,obj.code);

}**
Address()
{
    street_no=new char;
    house_no=new char;
    city=new char;
    code=new char;

}
~Address()
{
    delete street_no;
    delete house_no;
    delete city;
    delete code;
}

void set()
{
    cout<<"Enter Street Number : ";
    cin>>street_no;
    cout<<"Enter House Number : ";
    cin>>house_no;
    cout<<"Enter City : ";
    cin>>city;
    cout<<"Enter Code : ";
    cin>>code;
}
void get()
{

    cout<<"\nStreet Number : "<<street_no;
    cout<<"\nHouse Number : "<<house_no;
    cout<<"\nCity : "<<city;
    cout<<"\nCode : "<<code;

}



};

class person
{
Address obj;

public:
person()
{
}
person(person &one)
{
    Address::Address(one.obj);
}

void set()
{
    obj.set();
}

void get()
{
    obj.get();
}
~person()
{
exit(0);
}
};
int main()
{ 
person A;
A.set();
A.get();
**
person B(A);
    B.get();
**
getch();
}

2 个答案:

答案 0 :(得分:2)

Address()
{
    street_no=new char;
    house_no=new char;
    city=new char;
    code=new char;

}

这是你的第一个问题开始的地方。使用默认构造函数时,您将创建指向单个char的指针。当您尝试复制对象时,您会收到垃圾,因为strlen将查找\0字符来确定长度(除非您的char只是'\ 0 ',你将在UB的杂草中出发)。您的getset函数也会出现这种情况,因为它们会尝试写出char*(但实际上是期望一个带有终止空字符的数组),并在char*(同样的期望),但你只给他们1个字符写。换句话说,你将用你所写的东西在整个地方调用UB。

~Address()
{
    delete street_no;
    delete house_no;
    delete city;
    delete code;
}

这适用于您的默认构造函数(如编写),但对于您的复制构造函数不正确。修复默认构造函数后,这两者都不正确。创建新数组(new[])时,必须使用delete[]释放内存。

可以使用std::string修复整个问题,而不是尝试自己管理动态数组。

答案 1 :(得分:0)

在C ++中使用类'string'而不是char *。你不需要管理内存。所以替换

char *street_no,*house_no,*city,*code; 

与     string street_no,house_no,city,code;