2012-04-30 31 views
3

私はこれらの関数を両方とも実装したいので、クラスのオブジェクトを入出力できます。私は>>演算子を稼働させましたが、それほど多くはありません< <。ここで文字列の挿入演算子と抽出演算子のオーバーロード

は私の.hファイルで私のコードです:ここでは

class MyString 
    { 
     public: 
      MyString(); 
      MyString(char *message); 
      ~MyString(); 
      void Print(); 



      void Copy(MyString& rhs); 
      int Length(); 

      MyString& operator()(const int index, const char b); 
      char& operator()(const int i); 
      MyString& operator=(const MyString& rhs); 
      bool operator==(const MyString& other) const; 
      bool operator!=(const MyString& other) const; 
      const MyString operator+(const MyString& rhs) const; 

      MyString& operator+=(const MyString& rhs); 

     private: 

      char *String; 
      int Size; 
    }; 

    istream& operator>>(istream& input, MyString& rhs); 
    ostream& operator<<(ostream& output, const MyString& rhs); 

は私の.cppファイル内の2つの機能のために私のコードです:ここでは

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 MyString::operator+(const MyString& rhs) const 
{ 

    char* tmp = new char[Size + rhs.Size +1]; 

    for(int i = 0; i < Size; i++) 
    { 
      tmp[i] = String[i]; 
    } 
    for(int i = 0; i < rhs.Size+1; i++) 
    { 
      tmp[i+Size] = rhs.String[i]; 
    } 

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

    char* tmp = new char[Size + rhs.Size +1]; 

    for(int i = 0; i < Size; i++) 
    { 
      tmp[i] = String[i]; 
    } 
    for(int i = 0; i < rhs.Size+1; i++) 
    { 
      tmp[i+Size] = rhs.String[i]; 
    } 

    MyString result; 


    delete [] result.String; 
    result.String = tmp; 
    result.Size = Size+rhs.Size; 

    return result; 

    } 
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) 
{ 

    if(this != &rhs) 
    { 

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

    for(int i = 0; i < rhs.Size+1 ; i++) 
    { 
      String[i] = rhs.String[i]; 
    } 



    } 

    return *this; 


} 
    void MyString::Copy(MyString& rhs) 
{ 
    delete [] String; 
    Size = rhs.Size; 
    String = new char[rhs.Size]; 

    String = rhs.String; 
    } 

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

    char* tmp = new char[Size + rhs.Size + 1]; 

    for(int i = 0; i < Size; i++) 
    { 
      tmp[i] = String[i]; 
    } 

    for(int i = 0; i <rhs.Size+1; i++) 
    { 
      tmp[i+Size] = rhs.String[i]; 
    } 


    delete [] String; 
    String = tmp; 

    Size += rhs.Size; 

    return *this; 


} 

bool MyString::operator!=(const MyString& other) const 
{ 

    return !(*this == other); 


    } 
bool MyString::operator==(const MyString& other)const 
    { 
    if(other.Size == this->Size) 
    { 
      for(int i = 0; i < this->Size+1; i++) 
      { 
        if(&other == this) 

          return true; 
      } 
    } 
    else 
      return false; 
    } 

char& 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; 

    } 




istream& operator>>(istream& input, MyString& rhs) 
{ 
    char* temp; 
    int size(256); 
    temp = new char[size]; 
    input.getline(temp,size); 
    rhs = MyString(temp); 
    delete [] temp; 

    return input; 
} 

ostream& operator<<(ostream& output, const MyString& rhs) 
{ 
    char* p; 
    int size(256); 
    p = new char[size]; 
    output << rhs.MyString(p); 
    delete [] p; 
    return output; 
} 

は、それがで呼び出される方法ですmain.cppファイル:

cin >> SearchString >> TargetString; // Test of cascaded string-extraction operator<</* 

if(SearchString.Find(ConstString) != -1) {  
    cout << ConstString << " is not in " << SearchString << endl; } 

else {  
    cout << ConstString << " is in " << SearchString << endl; 
    cout << "Details of the hit: " << endl;  
    cout << "Starting poisition of the hit: " << SearchString.Find(ConstString) << endl;     
    cout << "The matching substring is: " << SearchString.Substring(SearchString.Find(ConstString), ConstString.length()); } 

また、cin >>演算子は完全に機能しますが、文字列を出力する方法を理解するのを手伝ってください。

+0

は、あなたは正しい、 'のstd :: STRING'を読み込み、' getlineの() '関数があることを知っていますか? –

+0

私は>>演算子を実装するためにgetline()を使用しましたが、これを使って<<を実装することもできます?? – user1363061

+0

いいえ、私はあなたが 'getline()'の 'char *'変種を使っていることを指摘していました。 'std :: string'バリアントがあります。 '<<'演算子に関しては、 'getline()'はストリームから読み込み、ストリームに書き込みたいので、論理的には 'getline()'を使うことはできません。 –

答えて

2

あなたが何を求めているのか分かりません。実装は、文字列をどのように出力するかによって異なります。コードは、最も可能性が高い。このようになります。いくつかの生の出力のために

output << rhs.get_data(); 
+0

は出力= rhs.get_data()となります。 ?? – user1363061

+0

'output'は' cout'と同じようにストリームです。 operator <<関数は、 'rhs'から' output'へのデータを、 'output << rhs.foo()'や 'output << rhs.bar()'のような文を使って書く必要があります。 –

+0

@ user1363061文字列の内容はどのように取得しますか? 'rhs.something()'になります。ですから 'output << rhs.something();'と書くだけです。 –

関連する問題