2013-11-23 57 views
0

這是代碼,我創建了一個包含另一個類的對象的類。我得到錯誤的輸出,即垃圾值..我不知道什麼是問題。複製構造函數在字符數組中無法正常工作

突出顯示的行,的輸出提供了垃圾的價值,但存在編譯沒有錯誤..我一直都使用微軟的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(); 
} 
+0

如果您手動分配內存,爲什麼包含?你應該利用std :: string,除非這是作業,你不得不這樣做。 – ApplePie

+0

使用C++字符串,修改你的代碼並告訴我們你遇到了什麼錯誤。其次,你的構造函數沒有做任何「特殊」的事情。你可以在'set'函數中完成'new char'。改變你的構造函數,把street_no,house_no,city,code作爲參數。你真的不應該在構造函數中做I/O。 – iab

回答

0

在C++中使用類「串」,而不是字符*。那麼你不需要管理內存。所以更換

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

與 串street_no,house_no,城市,代碼;

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修復整個問題,而不是嘗試自己管理動態數組。