2014-05-03 21 views
0

我現在快要放棄了 - 頭痛和紅眼睛。你們中有些人可能會低估這個問題,但我別無選擇。我不懶惰,但沒有人可以交談。運算符重載 - 創建一個新的String類

它的所有關於在C++中創建我自己的String類,其中可以將字符串連接起來,將另一個字符串對象發送到字符串構造函數中,或者將字符串文字發送給構造函數。

程序應該輸出如下:

hello hello2 
much hedache!!! 
Enter a name: 
hello John 

相反的程序產生如下:

hello hello2 
much hedache!!! 
Enter a name: 
much headache John 

對於somereason字符串「大爲頭痛」被保存在對象 - 不用字符串和字符串3串聯替換。

string2 = "much hedache!!!"; 

而且我注意到,這是在我向對象的構造函數發送字符串對象時造成的。

String string2(string); 

如果我現在這個更改爲以下:

String string2("hello2"); 

它的工作原理。

我不明白爲什麼,會很高興有人能回答這個問題。

#include <iostream> 
using namespace std; 

class String { 

public: 
char *string; 
String(char *ch) { 
    string = new char[strlen(ch)]; 

    int i = 0; 
    for(char *temp_ch_ptr = ch; *temp_ch_ptr; ++temp_ch_ptr) { 
     string[i] = *temp_ch_ptr; 
     i++; 
    } 

} 
String() { 
    string = new char[100]; 
} 

String (String &string_obj) { 

    string = new char[strlen(string_obj.string)]; 

    string = string_obj.string; 
} 

String operator=(char *ch) { 

    strcpy(string, ch); 

    return *this; 
} 

String operator+(String obj) { 

    String temp; 
    strcpy(temp.string, string); 
    strcat(temp.string, obj.string); 

    return temp; 
} 

}; 

ostream &operator<<(ostream &stream, String obj) { 

    stream << obj.string; 

    return stream; 
} 

istream &operator>>(istream &stream, String obj) { 

cout << "Enter a name: "; 
stream >> obj.string; 

return stream; 
} 



int main() { 

    String string("hello "); 
    //String string2("hello2 "); 
    String string2(string); 
    cout << string << string2 << endl; 

    string2 = "much hedache!!!"; 

    cout << string2 << endl; 

    String string3; 

    cin >> string3; 
    string2 = string + string3; 
    cout << string2 << endl; 

return 0; 
} 

我不確定複製構造函數 - 問題可以在那裏嗎?

+0

您需要跟蹤班級中實際的字符串長度!也相關:http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three –

回答

2

我不確定複製構造函數 - 問題可以在那裏嗎?

是的,絕對。它根本不起作用。

string = new char[strlen(string_obj.string)]; 

這裏創建相同的長度,現有字符串的一個新的數組。

string = string_obj.string; 

在這裏你完全丟掉新陣列(離開它叼着爲內存泄漏),然後設置新的字符串對象的指針是一樣老的字符串對象的指針。

您需要做一個深拷貝;我建議std::copy

此複製構造函數應採取const String&,而不是String&;同樣,如果你想傳遞字符串文字是有效的,你的char*構造函數實際上應該取const char*

+0

謝謝 - 現在努力工作。僅在複製構造函數中解決問題的方法是什麼?那麼運算符「=」超載的成員函數呢? – user2991252

1

你的程序有一個錯誤和內存泄漏。在拷貝構造函數中,你分配內存,但新的使用,而只是指向傳遞的字符串的內存。您應該將傳遞的字符串的內容複製到新分配的內存中。結果分配的內存丟失了。你也不提供任何析構函數來取消分配內存。

String (String &string_obj) { 

    string = new char[strlen(string_obj.string)]; 

    strcpy(string,string_obj.string); 
} 

~String(){delete string;}