2011-12-05 34 views
0

的C++運算符我有一個​​字符*問題,字符串相加 例如像這樣:實現串

enter code here 
s2 = s3 + "," + s1; 

和我有三個運營商下面

friend Mystring operator+(const Mystring &lhs, const Mystring &rhs); -- 1 
friend Mystring operator+(const Mystring &mystr, const char *ch); -- 2 
friend Mystring operator+(const char *ch, const Mystring &mystr); -- 3 

,但我用1和3它會崩潰,但我使用1和3可以做得很好。

我的問題是順序不是s3 +「,」所以先用運算符w先用 ,結果使用運算符3,但事實並不如我想象的那樣。

任何人都可以解釋爲什麼會發生這種情況?

Mystring operator+(const Mystring &mystr,const char *ch) 
{ 
    Mystring tmp; 
    tmp.str_ = new char[ strlen(mystr.str_)+2 ]; 
    strcpy(tmp.str_, mystr.str_); 
    strcat(tmp.str_, ch); 
    return tmp; 
} 


Mystring operator+(const char *ch, const Mystring &mystr) 
{ 
    Mystring tmp; 
    tmp.str_ = new char[ strlen(mystr.str_)+strlen(mystr.str_)+1 ]; 
    strcpy(tmp.str_, mystr.str_); 
    strcat(tmp.str_, mystr.str_); 
    return tmp; 
} 

Mystring operator+(const Mystring &lhs, const Mystring &rhs) 
{ 
    Mystring tmp; 
    tmp.str_ = new char[ strlen(lhs.str_)+strlen(rhs.str_)+1 ]; 
    strcpy(tmp.str_, lhs.str_); 
    strcat(tmp.str_, rhs.str_); 
    return tmp; 
} 
+2

你可以發佈每個運算符的定義以及你得到的確切錯誤嗎? – MGZero

+2

你的問題不清楚。 「我使用1和3它會崩潰,但我使用1和3可以做得很好」是什麼意思? –

+0

「Mystring」的定義是什麼? –

回答

2

嘗試先進行測試簡單的事情:

s2 = s3 + ","; 
s2 = "," + s3; 
s3 = s1 + s2; 

上移動到鏈接之前:

s2 = s3 + "," + s1; 

這樣你可以告訴是什麼問題更加清晰。

+0

但有人說如果你的操作符創建一個新的值,它必須返回值而不是引用,而不是 –

+0

你是對的,今天早上累了。 –

1

Mystring operator+(const Mystring &mystr,const char *ch) 
{ 
    Mystring tmp; 
    tmp.str_ = new char[ strlen(mystr.str_)+2 ]; 

你應該寫:

tmp.str_ = new char[ strlen(mystr.str_) + strlen(ch) + 1 ]; 

在這裏:

Mystring operator+(const char *ch, const Mystring &mystr) 
{ 
    Mystring tmp; 
    tmp.str_ = new char[ strlen(mystr.str_)+strlen(mystr.str_)+1 ]; 

你應該寫:

tmp.str_ = new char [ strlen(ch) + strlen(mystr.str_) + 1 ]; 
+1

教學C++我學會了(困難的方式),如果我想教導我的學生如何通過實現他們自己的字符串類來重載操作符_,我最好建議他們使用'std :: vector '來存儲他們的數據,以及_concentrate on operator overloading_。手動管理數據應該是下一步,學生將專注於手動資源管理。同時做這兩件事,其中大部分都是超載。 – sbi

+0

謝謝,我會試試^^ –

+1

如果我要教操作員超載,我會從複雜的或有理數的數字開始。 IMVHO比字符串更簡單。 –

0

你讀過這個嗎? What is The Rule of Three?

根據你在這些函數中手動管理內存的方式,我認爲假設你沒有這樣做是安全的。無論如何,一旦你確實實施了三大戰略,這就是你應該做的。首先你應該有兩個不可分割的成員。一個用於存儲字符串的大小,另一個用於存儲動態數組的容量。然後你想擁有一個私人功能,我們稱之爲increase_capacity,如果需要增加容量。所有的內存分配將在一個地方發生。它將大大簡化事情。它可能是這個樣子:現在

void increase_capacity(int cap) 
{ 
    if (cap <= capacity_) return; 
    char * temp = new char[cap]; 
    capacity_ = cap; 
    memcpy(temp, str_, size_); // Or size_ + 1 if your string is null terminated. 
           // It doesn't have to be. 
    delete [] str_; 
    str_ = temp; 
} 

,你也應該有一個調整大小功能,即調節大小,如果需要的話。

void resize(int size) 
{ 
    if (size > capacity_) 
    { 
     int cap = capacity_ * 2; 
     cap = cap > size ? cap : size; 
     increase_capacity(cap); 
    } 

    size_ = size; 
    // Fill in new elements with some default value, or don't. 
} 

高於一切之上,你應該只使用vector<char>更好,但也許你想了解手動內存管理,這很好。現在

,你應該實現運營商+ =,作爲一個成員:

Mystring & operator+=(const Mystring & rhs) 
{ 
    int old_size = size_; 
    resize(size_ + rhs.size_); 
    memcpy(str_ + old_size, rhs.str_, rhs.size_); 
    return *this; 
} 

如果你願意,你也可以實現一個需要const char *,這將節省如果你依賴於隱含的是會發生的分配轉換。

最後,你可以實現你的operator+

Mystring operator+(Mystring lhs, const Mystring & rhs) 
{ 
    return lhs += rhs; 
} 

如果從const char *的隱式轉換,即應該涵蓋所有的人。但是如果你寫了額外的operator+=需要一個const char *爲了做更少的分配,你應該也可以寫一個const char *在它的右邊。它看起來與上面的一樣,只是第二個參數的類型發生了變化。你不需要爲反向操作寫一個,因爲無論如何lhs都需要被分配爲一個Mystring。