2012-04-30 4 views
3

클래스의 객체를 입력 및 출력 할 수 있도록이 두 함수를 모두 구현하고자합니다. >> 연산자는 작동하지만 많지는 않습니다. < <. 그것이 호출하는 방법을문자열의 삽입 및 추출 연산자 오버로드

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; 
} 
다음

은 다음과 같습니다

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 파일의 두 가지 기능에 대한 내 코드입니다 : 여기

내 .H 파일에 내 코드입니다 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

는 당신이 바로'표준 : 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 << rhs.foo()'또는'output << rhs.bar()'와 같은 명령문을 사용하여'output'으로 데이터를 써야합니다. –

+0

@ user1363061 문자열의 내용을 어떻게 얻습니까? 그것은'rhs.something()'이 될 것입니다. 그래서'output << rhs.something();을 작성하십시오. –