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

4

1 に答える 1

2

あなたが何を求めているのかよくわかりません。実装は、文字列をどのように出力するかによって異なります。

生の出力の場合、コードは次のようになります。

output << rhs.get_data();
于 2012-04-30T13:01:26.207 に答える