2012-04-28 160 views
0

好吧我對運算符重載非常陌生,我必須在面向對象的程序中執行這個函數,但我絕對需要幫助。這裏有操作的指令:運算符+超載

的MyString的對象應包含打印 串

的MyString的對象應包含報告 長度的串的長度()方法的打印()方法

MyString對象應該包含一個默認構造函數,它將 初始字符串設置爲「Hello World」的值。

MyString對象應該包含一個替代構造函數,它允許設置字符串的初始值。

的MyString的對象應重載以下運算符:

  • 括號運營商應該被重載來代替set和get你以前的分配的功能。請注意,兩個實例 應在違反字符串數組邊界時發出exit(1)。

  • 賦值運算符(=)將把源字符串複製到目標字符串中。請注意,目的地的尺寸需要調整爲與源相同的 。

  • 邏輯比較運算符(==),如果兩個字符串的大小和內容相同,則返回true。

  • 否定的邏輯比較操作符(!=),它返回2.

  • 加法運算符(+),其符連接使用兩個字符串

  • 加法/分配新建分配FY運算符(+ =)的布爾非以下列方式:字符串1 + = String2的作爲字符串1 =字符串1 + String2的操作

  • 兩者加(+)和賦值(=)運營商需要能夠級聯operati的附件。這意味着String3 = String1 + String2或String1 = String2 = String3應該可以工作。

這是我在.cpp文件中的代碼:

MyString::MyString() 
{ 
     char temp[] = "Hello World"; 

     int counter(0); 
     while(temp[counter] != '\0') { 
       counter++; 
     } 
     Size = counter; 
     String = new char [Size]; 
     for(int i=0; i < Size; i++) 
      String[i] = temp[i]; 

} 

MyString::MyString(char *message) 

{ 
     int counter(0); 
     while(message[counter] != '\0') { 
      counter++; 
     } 
     Size = counter; 
     String = new char [Size]; 
     for(int i=0; i < Size; i++) 
      String[i] = message[i]; 
} 

MyString::~MyString() 
{ 
     delete [] String; 
} 

int MyString::Length() 
{ 
     int counter(0); 

     while(String[counter] != '\0') 
     { 
      counter ++; 
     } 

     return (counter); 
    } 

**const MyString operator +(const MyString& one, const MyString& two) 
{ 
     MyString String1; 
     return String1; 
}** 



MyString& MyString::operator()(const int index, const char b) 
{ 
     if(String[index] == '\0') 
     { 
       exit(1); 
     } 
     else 
     { 
     String[index] = b; 
     } 


} 

MyString& MyString::operator=(const MyString& rhs) 
{ 

     Size = rhs.Size; 
     counter = rhs.counter; 

     delete [] String; 
     String = new char[Size]; 


     for(int i = 0; i < counter+1 ; i++) 
     { 
       String[i] = rhs.String[i]; 
     } 
     return *this; 

} 

bool MyString::operator==(const MyString& one) 
{ 
     if(one.Length() == two.Length()) 
     { 
       for(int i = 0; i < one.Length()+1; i++) 
       { 
         if(one[i] == two[i]) 
          return true; 
       } 
     } 
     else 
      return false; 
} 

MyString& MyString::operator()(const int i) 
{ 

     if(String[i] == '\0') 
     { 
       exit(1); 
     } 
     else 
     { 

      return String[i]; 

     } 
} 

void MyString::Print() 
{ 
     for(int i=0; i < Size; i++) 
       cout << String[i]; 
     cout << endl; 

} 

這是我在主文件代碼:

int main (int argc, char **argv) 
{ 

MyString String1;    //Test of default constructor. Use "Hello world" 
MyString String2 ("Two strings are not equal");  //Test of alternate constructor 
MyString String3 ("Two strings are equal"); 
MyString String4 (String1); 

cout << "*************Test of values*************" << endl; 
String1.Print(); 
String2.Print(); 
String3.Print(); 

cout << "*************Test of Length*************" << endl; 
cout << String1.Length() << " "; 
cout << String2.Length() << " "; 
cout << String3.Length() << endl; 

cout << "*************Test of Set*************" << endl; 
String1 (0, 'J'); 
String1.Print(); 

cout << "*************Test of Copy*************" << endl; 
String1.Print(); 
cout << endl; 
String3.Print(); 
cout << endl; 
String3.Copy (String1);  //String1 should be copied into String3 
String1.Print(); 
cout << endl; 
String3.Print(); 
cout << endl; 

cout << "*************Test of Get*************" << endl; 
for (int i = 0; i < String1.Length(); i++) //The last character should exit the program 
    { 
     cout << String1 (i) << " "; 
    } 
    } 
    cout << endl; 

    if (String1 == String4) 
    { 
     String3.Print(); 
    } 
    else 
    { 
    String4.Print(); 
    } 

    if (String1 != String4) 
    { 
     String3.Print(); 
    } 
    else 
    { 
     String4.Print(); 
    } 

    String1 = String2 = String3; 
    String1.Print(); 
    String2.Print(); 
    String3.Print(); 


    String1 = String2 + String3 + String4; 
    String1.Print(); 

    String2 += String3; 
    String2.Print(); 

    return 0; 

} 

的main.cpp的文件不能改變但另一個.cpp文件必須編譯並與該文件一起運行。

回答

7

您需要把運營商的聲明在一個頭,但你有問題是,你正在使用operator+您的字符串operator+內爲您的字符串

const MyString operator +(const MyString& one, const MyString& two) { 
     MyString String1 = one + two; // this calls operator+, which calls operator+, which calls... 
     return String1; 
} 

而且,由於你是返回MyString的價值,你不應該const返回:

MyString operator +(const MyString& one, const MyString& two) { 
     MyString String1; 
     // do something with the data of one and two and put it in String1 
     return String1; 
} 

最後,如果您的運營商需要訪問的MyString非公開數據,你應該十二月把它當作你的MyString課程的朋友。

class MyString { 

// as before 

friend MyString operator+(const Mytring& rhs, const MyString& lhs); 

}; 
+0

你和我在同一時間寫答案,但你的更好,並涵蓋了所有地雷覆蓋。現在刪除我的。謝謝。 +1 – thb 2012-04-28 15:51:38

+0

我想連接兩個字符串,但我很困惑我該怎麼做,而實際上並沒有使用+。 – user1363061 2012-04-28 16:12:12

+0

@ user1363061它真的取決於你的'MyString'類的細節。也許你可以提供更多的細節? – juanchopanza 2012-04-28 16:14:11