Announcement

Collapse
No announcement yet.

giúp em bài overload toán tử!

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • giúp em bài overload toán tử!

    sau khi viết code xong, debug thì không hiểu chuyện gì xảy ra, ace nào xem và hướng dẩn giúp em với thanks!
    code of em đây
    #include <iostream>
    using namespace std;
    class String
    {
    private :
    char* Str;
    int n;
    public:
    String();
    ~String();
    String operator +(const String &) const;
    friend bool operator ==(const String &, const String &) ;
    friend bool operator !=(const String &, const String &);
    friend istream & operator >>(istream & , String & );
    friend ostream & operator <<(ostream &, const String &);
    };
    void main()
    {
    String x, y, z;
    cin>>x;
    cin>>y;
    x + y;
    cout<<"chuoi tong: "<< x;
    /*if(x==y)
    cout << " chuoi x:' "<< x << " ' bang " << "chuoi y: ' "<<y<<" '";
    if(x!=y)
    cout << " chuoi x:' "<< x << " ' khac " << "chuoi y: ' "<<y<<" '";*/
    }

    String :: String()
    {
    Str = new char[400];
    n = 0;
    if(Str == NULL)
    {
    cout<<"cap phat that bai";
    exit(0);
    }
    }
    String ::~String()
    {
    delete [] Str;
    }

    String String :: operator +(const String & x) const
    {
    String z;
    z.n = this->n+x.n;
    for(int i=0; i < this->n; i++)
    {
    z.Str[i]=this->Str[i];
    }
    for(int i=0; i < x.n; i++)
    z.Str[i+this->n] = x.Str[i];
    cout<<z;
    return z;
    }
    bool operator ==(const String & x, const String & y)
    {
    if(x.n != y.n)
    return false;
    for(int i=0; i<x.n;i++)
    {
    if(x.Str[i] != y.Str[i])
    return false;
    }
    return true;
    }
    bool operator !=(const String & x, const String & y)
    {
    if( x==y)
    return false;
    return true;
    }
    istream & operator >>(istream & in_put , String & x )
    {
    in_put.getline(x.Str,400);
    x.n = strlen(x.Str);
    return in_put;
    }
    ostream & operator <<(ostream & out, const String & x)
    {
    for(int i=0;i<x.n;i++)
    out << x.Str[i];
    out << "\n" ;
    return out;
    }

  • #2
    Originally posted by 11520648 View Post
    sau khi viết code xong, debug thì không hiểu chuyện gì xảy ra, ace nào xem và hướng dẩn giúp em với thanks!
    code of em đây
    #include <iostream>
    using namespace std;
    class String
    {
    private :
    char* Str;
    int n;
    public:
    String();
    ~String();
    String operator +(const String &) const;
    friend bool operator ==(const String &, const String &) ;
    friend bool operator !=(const String &, const String &);
    friend istream & operator >>(istream & , String & );
    friend ostream & operator <<(ostream &, const String &);
    };
    void main()
    {
    String x, y, z;
    cin>>x;
    cin>>y;
    x + y;
    cout<<"chuoi tong: "<< x;
    /*if(x==y)
    cout << " chuoi x:' "<< x << " ' bang " << "chuoi y: ' "<<y<<" '";
    if(x!=y)
    cout << " chuoi x:' "<< x << " ' khac " << "chuoi y: ' "<<y<<" '";*/
    }

    String :: String()
    {
    Str = new char[400];
    n = 0;
    if(Str == NULL)
    {
    cout<<"cap phat that bai";
    exit(0);
    }
    }
    String ::~String()
    {
    delete [] Str;
    }

    String String :: operator +(const String & x) const
    {
    String z;
    z.n = this->n+x.n;
    for(int i=0; i < this->n; i++)
    {
    z.Str[i]=this->Str[i];
    }
    for(int i=0; i < x.n; i++)
    z.Str[i+this->n] = x.Str[i];
    cout<<z;
    return z;
    }
    bool operator ==(const String & x, const String & y)
    {
    if(x.n != y.n)
    return false;
    for(int i=0; i<x.n;i++)
    {
    if(x.Str[i] != y.Str[i])
    return false;
    }
    return true;
    }
    bool operator !=(const String & x, const String & y)
    {
    if( x==y)
    return false;
    return true;
    }
    istream & operator >>(istream & in_put , String & x )
    {
    in_put.getline(x.Str,400);
    x.n = strlen(x.Str);
    return in_put;
    }
    ostream & operator <<(ostream & out, const String & x)
    {
    for(int i=0;i<x.n;i++)
    out << x.Str[i];
    out << "\n" ;
    return out;
    }
    thay đổi hàm operator +như sau String &operator +(const String &) const; đoạn code sau đã sửa rùi đó.
    PHP Code:
    #include <iostream>
    using namespace std;
    class 
    String
    {
        private :
        
    charStr;
        
    int n;
        public:
        
    String();
        ~
    String();
        
    String &operator +(const String &) const;
        
    friend bool operator ==(const String &, const String &) ;
        
    friend bool operator !=(const String &, const String &);
        
    friend istream operator >>(istream & , String & ); 
        
    friend ostream operator <<(ostream &, const String &);
    };
    void main()
    {
        
    String xyz;
        
    cin>>x;
        
    cin.ignore();
        
    cin>>y;
        
    y;
        
    cout<<"chuoi tong: "<< x;
        
    /*if(x==y)
        cout << " chuoi x:' "<< x << " ' bang " << "chuoi y: ' "<<y<<" '";
        if(x!=y)
        cout << " chuoi x:' "<< x << " ' khac " << "chuoi y: ' "<<y<<" '";*/
    }

    String :: String()
    {
        
    Str = new char[400];
        
    0;
        if(
    Str == NULL)
        {
            
    cout<<"cap phat that bai";
            exit(
    0);
        }
    }
    String ::~String()
    {
        
    delete [] Str;
    }

    String &String :: operator +(const String x) const
    {
        
    String z;
        
    z.this->n+x.n;
        for(
    int i=0this->ni++)
        {
            
    z.Str[i]=this->Str[i];
        }
        for(
    int i=0x.ni++)
            
    z.Str[i+this->n] = x.Str[i];
        
    cout<<z;
        return 
    z;
    }
    bool operator ==(const String x, const String y)
    {
    if(
    x.!= y.n)
    return 
    false;
    for(
    int i=0i<x.n;i++)
    {
    if(
    x.Str[i] != y.Str[i])
    return 
    false;
    }
    return 
    true;
    }
    bool operator !=(const String x, const String y)
    {
    if( 
    x==y)    
    return 
    false;
    return 
    true;
    }
    istream operator >>(istream in_put String )
    {
    in_put.getline(x.Str,400);
    x.strlen(x.Str);
    return 
    in_put;
    }
    ostream operator <<(ostream out, const String x)
    {
    for(
    int i=0;i<x.n;i++)
    out << x.Str[i];
    out << "\n" ;
    return 
    out;

    lỗi của bạn như sau: trong hàm toán tử + xét câu lệnh return z; khi thực hiện câu lệnh này, chương trình sẽ tạo ra 1 bản sao của z và trả về bản sao này, còn z thì do là biến cục bộ nên sẽ bị hủy.
    tạo ra bản sao bằng cách gọi hàm khởi tạo sao chép, cái hàm này bạn không định nghĩa nên chương trình sẽ chạy hàm khởi tạo sao chép mặc định là sao chép từng bít từ biến z sang bản sao, việc sao chép này làm cho con trỏ char *Str trong bản sao và con trỏ char *Str trong z cùng trỏ đến 1 vùng nhớ.
    khi z bị hủy, thì vùng nhớ của Str(z) bị hủy theo, kéo theo Str(bản sao) không có vùng nhớ nào cả, do đó chương trình sẽ lỗi.
    ở đây. bạn phải định nghĩa hàm khởi tạo sao chép, hoặc giải pháp tạm thời làm như trên, hàm operator + trả về 1 tham chiếu đến biến z, khi trả về tham chiếu thì chương trình sẽ không tạo ra 1 biến mới nào cả mà lấy z trả về luôn, do đó, loại trừ được lỗi. các hàm còn lại, chưa test.
    Last edited by 11520327; 25-10-2012, 08:11.

    Comment


    • #3
      Originally posted by 11520327 View Post
      thay đổi hàm operator +như sau String &operator +(const String &) const; đoạn code sau đã sửa rùi đó.
      PHP Code:
      #include <iostream>
      using namespace std;
      class 
      String
      {
          private :
          
      charStr;
          
      int n;
          public:
          
      String();
          ~
      String();
          
      String &operator +(const String &) const;
          
      friend bool operator ==(const String &, const String &) ;
          
      friend bool operator !=(const String &, const String &);
          
      friend istream operator >>(istream & , String & ); 
          
      friend ostream operator <<(ostream &, const String &);
      };
      void main()
      {
          
      String xyz;
          
      cin>>x;
          
      cin.ignore();
          
      cin>>y;
          
      y;
          
      cout<<"chuoi tong: "<< x;
          
      /*if(x==y)
          cout << " chuoi x:' "<< x << " ' bang " << "chuoi y: ' "<<y<<" '";
          if(x!=y)
          cout << " chuoi x:' "<< x << " ' khac " << "chuoi y: ' "<<y<<" '";*/
      }

      String :: String()
      {
          
      Str = new char[400];
          
      0;
          if(
      Str == NULL)
          {
              
      cout<<"cap phat that bai";
              exit(
      0);
          }
      }
      String ::~String()
      {
          
      delete [] Str;
      }

      String &String :: operator +(const String x) const
      {
          
      String z;
          
      z.this->n+x.n;
          for(
      int i=0this->ni++)
          {
              
      z.Str[i]=this->Str[i];
          }
          for(
      int i=0x.ni++)
              
      z.Str[i+this->n] = x.Str[i];
          
      cout<<z;
          return 
      z;
      }
      bool operator ==(const String x, const String y)
      {
      if(
      x.!= y.n)
      return 
      false;
      for(
      int i=0i<x.n;i++)
      {
      if(
      x.Str[i] != y.Str[i])
      return 
      false;
      }
      return 
      true;
      }
      bool operator !=(const String x, const String y)
      {
      if( 
      x==y)    
      return 
      false;
      return 
      true;
      }
      istream operator >>(istream in_put String )
      {
      in_put.getline(x.Str,400);
      x.strlen(x.Str);
      return 
      in_put;
      }
      ostream operator <<(ostream out, const String x)
      {
      for(
      int i=0;i<x.n;i++)
      out << x.Str[i];
      out << "\n" ;
      return 
      out;

      lỗi của bạn như sau: trong hàm toán tử + xét câu lệnh return z; khi thực hiện câu lệnh này, chương trình sẽ tạo ra 1 bản sao của z và trả về bản sao này, còn z thì do là biến cục bộ nên sẽ bị hủy.
      tạo ra bản sao bằng cách gọi hàm khởi tạo sao chép, cái hàm này bạn không định nghĩa nên chương trình sẽ chạy hàm khởi tạo sao chép mặc định là sao chép từng bít từ biến z sang bản sao, việc sao chép này làm cho con trỏ char *Str trong bản sao và con trỏ char *Str trong z cùng trỏ đến 1 vùng nhớ.
      khi z bị hủy, thì vùng nhớ của Str(z) bị hủy theo, kéo theo Str(bản sao) không có vùng nhớ nào cả, do đó chương trình sẽ lỗi.
      ở đây. bạn phải định nghĩa hàm khởi tạo sao chép, hoặc giải pháp tạm thời làm như trên, hàm operator + trả về 1 tham chiếu đến biến z, khi trả về tham chiếu thì chương trình sẽ không tạo ra 1 biến mới nào cả mà lấy z trả về luôn, do đó, loại trừ được lỗi. các hàm còn lại, chưa test.
      úm ùm, thanks bạn bạn nha!

      Comment

      LHQC

      Collapse
      Working...
      X