Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Về quá tải toán tử trong C++

  1. #1
    Ngày gia nhập
    08 2010
    Bài viết
    86

    Mặc định Về quá tải toán tử trong C++

    Chào các bác, em có đoạn chương trình sau. Các bác cho em biết tại sao khi viết cout<<a++; hoặc cout<<++a; thì lại báo lỗi ạ. Xin cảm ơn các bác.
    Code:
    #include<iostream>
    using namespace std;
    class PS{
    		int ts, ms;
    	public:
    		PS(int t=1, int m=2){
    			ts=t;
    			ms=m;
    		}
    	friend istream &operator>>(istream &is, PS &p);
    	friend ostream &operator<<(ostream &os, PS &p);	
    
    	PS operator++();//++x
    	PS operator++(int);//x++
    };
    
    
    PS PS::operator++(){
    	++ts;
    	return *this;
    }
    PS PS::operator++(int){
    	PS temp=*this;
    	ts++;
    	return temp;
    }
    
    istream &operator>>(istream &is, PS &p){
    	cout<<"Nhap ts, ms: ";
    	is>>p.ts>>p.ms;
    	return is;	
    }
    //////////////////////////////////////////////////////
    ostream &operator<<(ostream &os, PS &p){
    	os<<p.ts<<"/"<<p.ms<<endl;
    	return os;
    }
    
    main()
    {
    	PS a(1,2);
    	cout<<a;
    	++a;
    	cout<<a;
    	a++;
    	cout<<a;
    	//a = 3/2
    	PS b;
    	b = a++;// b = 3/2; a = 4/2
    	cout<<"a= "<<a++<<" b= "<<b;//báo lỗi ở đây
    	PS c;
    	c = ++a; // c = 5/2; a = 5/2
    	cout<<"a= "<<a<<" c= "<<c;
    }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Chào các bác, em có đoạn chương trình sau. Các bác cho em biết tại sao khi viết cout<<a++; hoặc cout<<++a; thì lại báo lỗi ạ. Xin cảm ơn các bác.
    Code:
    #include<iostream>
    using namespace std;
    class PS{
    		int ts, ms;
    	public:
    		PS(int t=1, int m=2){
    			ts=t;
    			ms=m;
    		}
    	friend istream &operator>>(istream &is, PS &p);
    	friend ostream &operator<<(ostream &os, PS &p);	
    
    	PS operator++();//++x
    	PS operator++(int);//x++
    };
    
    
    PS PS::operator++(){
    	++ts;
    	return *this;
    }
    PS PS::operator++(int){
    	PS temp=*this;
    	ts++;
    	return temp;
    }
    
    istream &operator>>(istream &is, PS &p){
    	cout<<"Nhap ts, ms: ";
    	is>>p.ts>>p.ms;
    	return is;	
    }
    //////////////////////////////////////////////////////
    ostream &operator<<(ostream &os, PS &p){
    	os<<p.ts<<"/"<<p.ms<<endl;
    	return os;
    }
    
    main()
    {
    	PS a(1,2);
    	cout<<a;
    	++a;
    	cout<<a;
    	a++;
    	cout<<a;
    	//a = 3/2
    	PS b;
    	b = a++;// b = 3/2; a = 4/2
    	cout<<"a= "<<a++<<" b= "<<b;//báo lỗi ở đây
    	PS c;
    	c = ++a; // c = 5/2; a = 5/2
    	cout<<"a= "<<a<<" c= "<<c;
    }
    Toán tử <<của bạn yêu cầu PS& là tham chiếu, trong khi đó a++, ++a lại trả về giá trị, nên báo lỗi. Bạn sửa lại là PS& operator++() và PS& operator++(int) là được. Hàm main thiếu kiểu trả về kìa.
    Đã được chỉnh sửa lần cuối bởi khoaph : 16-11-2019 lúc 09:26 PM.

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    86

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Toán tử <<của bạn yêu cầu PS& là tham chiếu, trong khi đó a++, ++a lại trả về giá trị, nên báo lỗi. Bạn sửa lại là PS& operator++() và PS& operator++(int) là được. Hàm main thiếu kiểu trả về kìa.
    Cảm ơn bác. Tôi sửa được rồi.

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Cảm ơn bác. Tôi sửa được rồi.
    Mình đã phạm một lỗi nghiêm trọng khi sửa như trên
    Bạn đừng sửa như trên
    Cứ giữ nguyên
    "PS operator++()" và "PS operator++(int)"
    Hãy sửa "friend ostream& operator<<(ostream& os, PS ps);"
    Còn lỗi như thế nào thì hãy đọc bài viết này Method trả về tham chiếu là biến địa phương lúc chính xác lúc không chính xác?

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    474

    "PS& operator++()" và "PS operator++(int)"

    ++ prefix thì trả về chính đối tượng đó (PS&), còn ++ postfix thì trả về copy của đối tượng trước khi ++ (PS)


    C++ Code:
    1. PS& operator++()
    2. {
    3.     // thực hiện ++
    4.     return *this;
    5. }
    6.  
    7. PS operator++(int)
    8. {
    9.     PS old(*this); // old là giá trị của *this trước khi thực hiện ++
    10.     ++*this; // thực hiện ++ thông qua ++ prefix, don't repeat yourself
    11.     return old;
    12. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn