Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Sử dụng toán tử operator thay thế cho phép gán ?

  1. #1
    Ngày gia nhập
    03 2011
    Bài viết
    18

    Exclamation Sử dụng toán tử operator thay thế cho phép gán ?

    Code:
    #include<iostream.h>
    
    class phanso
    {
    	int tu;
    	int mau;
    public:
    	void nhap();
    	void xuat();
    	void gan(int t,int m)                        
    	{
    		tu=t;
    		mau=m;	
    	}
    	void rutgon();
    	int uscln(int x,int y);
    	phanso operator+(phanso ps2);
    	int operator >(phanso ps2);
    	int operator <(phanso ps2);
    };
    class dayphanso
    {
    	phanso a[100];
    	int n;
    public:
    	void nhapday();
    	void xuatday();
    	phanso tongday();
    	phanso max();
    	phanso min();
    	phanso sapxep();
    };
    void phanso::nhap()
    {
    	cout<<"Nhap tu : ";
    	cin>>tu;
    	cout<<"Nhap mau : ";
    	cin>>mau;
    }
    void phanso::xuat()
    {
    	cout<<tu<<"/"<<mau;
    }
    int phanso::uscln(int x,int y)
    {
    	while(x>0&&y>0)
    	{
    		if(x>y)
    			x-=y;
    		else
    			y-=x;
    	}
    	return x+y;
    }
    void phanso::rutgon()
    {
    	int us=uscln(tu,mau);
    	tu/=us;
    	mau/=us;
    }
    void dayphanso::nhapday()
    {
    	cout<<"\Nhap so pt phan so : ";
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cout<<"Phan so ["<<i+1<<"] : ";
    		a[i].nhap();
    	}
    }
    void dayphanso::xuatday()
    {
    	for(int i=0;i<n;i++)
    	{
    		a[i].xuat();
    		cout<<"\t";
    	}
    }
    int phanso::operator>(phanso ps2)
    {
    	return ((tu*ps2.mau)>(mau*ps2.tu));
    }
    int phanso::operator<(phanso ps2)
    {
    	return ((tu*ps2.mau)<(mau*ps2.tu));
    }
    phanso phanso::operator+(phanso ps2)
    {
    	phanso kq;
    	kq.tu=tu*ps2.mau+mau*ps2.tu;
    	kq.mau=mau*ps2.mau;
    	return kq;
    }
    phanso dayphanso::tongday()          
    {
    	phanso s;
    	s.gan(0,1);  //Phần này làm sao sử dụng toán tử operator để thay thế cho gán được ( làm     sao ra s=(0,1) thay cho s.gan(0,1) ?? )
    	for(int i=0;i<n;i++)
    		s=s+a[i];
    	s.rutgon();
    	return s;
    }
    phanso dayphanso::max()
    {
    	phanso max=a[0];
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]>max)
    		max=a[i];
    	}
    	return max;
    }
    phanso dayphanso::min()
    {
    	phanso min=a[0];
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]<min)
    		min=a[i];
    	}
    	return min;
    }
    phanso dayphanso::sapxep()
    {
    	phanso temp;
    	for(int i=0;i<n;i++)
    		for(int j=i+1;j<n;j++)
    			if(a[j]>a[i])
    			{
    				temp=a[i];
    				a[i]=a[j];
    				a[j]=temp;
    			}
    }
    int main()
    {
    	dayphanso A;
    	A.nhapday();
    	A.xuatday();
    	cout<<"\nTong day la : ";
    	A.tongday().xuat();
    	cout<<"\nMax : ";
    	A.max().xuat();
    	cout<<"\nMin : ";
    	A.min().xuat();
    	cout<<"\nSap Xep : ";
    	A.sapxep();
    	A.xuatday();
    }
    Cho mình hỏi phần Tổng dãy này sao sử dụng toán tử operator để thay thế cho gán được ( làm sao ra s=(0,1) thay cho s.gan(0,1) ?? )

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Do toán tử () có độ ưu tiên cao hơn toán tử , cho nên có làm kiểu gì đi nữa thì
    C++ Code:
    1. s=(0,1)
    vẫn tương đương:
    C++ Code:
    1. s=1

    Vậy nên phải làm kiểu này:
    C++ Code:
    1. s= 0, 1;
    nó sẽ tương đương với:
    C++ Code:
    1. (s=0).operator,(1)
    việc của bạn là định nghĩa operator, giống như đã làm với các toán tử khác.

    Ví dụ:
    C++ Code:
    1. #include <iostream>
    2.  
    3. class Fraction {
    4.     int a, b;
    5. public:
    6.     Fraction(int a_, int b_) : a(a_), b(b_) {}
    7.  
    8.     struct AssignB {
    9.         Fraction& f;
    10.         AssignB(Fraction& f_) : f(f_) { }
    11.  
    12.         Fraction& operator,(int b) {
    13.             f.b = b;
    14.             return f;
    15.         }
    16.     };
    17.  
    18.     AssignB operator=(int a_) {
    19.         a = a_, b = 1;
    20.         return AssignB(*this);
    21.     }
    22.  
    23.     friend std::ostream&
    24.         operator<<(std::ostream& os, Fraction const& f) {
    25.             os << f.a << ' ' << f.b;
    26.             return os;
    27.         }
    28. };
    29.  
    30. int main() {
    31.     Fraction f1 (2, 5);
    32.     std::cout << f1 << std::endl;
    33.  
    34.     f1 = 3, 4;
    35.     std::cout << f1 << std::endl;
    36.  
    37.     return 0;
    38. }

    In ra
    Code:
    2 5
    3 4
    Đã được chỉnh sửa lần cuối bởi boss14420 : 26-03-2012 lúc 04:31 AM. Lý do: Chuyển con trỏ thành tham chiếu cho gọn

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    @boss14420: bạn hơi phức tạp vấn đề trong chỗ quá tải toán tử , và =. Đơn giản thế này:

    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class fraction {
    6. public:
    7.     fraction(int n, int d) :n(n), d(d) {
    8.  
    9.     }
    10.  
    11.     fraction& operator =(int num) {
    12.         n = num;
    13.         return *this;
    14.     }
    15.  
    16.     fraction& operator ,(int den) {
    17.         d = den;
    18.         return *this;
    19.     }
    20.  
    21.     friend ostream& operator <<(ostream& out, const fraction& obj) {
    22.         return obj.print(out);
    23.     }
    24.  
    25. private:
    26.     int n;
    27.     int d;
    28.  
    29. private:
    30.     ostream& print(ostream& out) const {
    31.         return out << n << "/" << d;
    32.     }
    33. };
    34.  
    35. int main() {
    36.     fraction f(10, 5); 
    37.     cout << f << endl;
    38.     f = 1, 2;
    39.     cout <<  f << endl;
    40. }

    Tuy nhiên cách trên là không khuyến khích vì nó gây khó hiểu cho người đọc code của bạn
    Rule of thumb: never overload operator "," unless it's extremely clear in the current context. For example, array[3] = 1, 2, 3.
    Nếu bạn dùng C++11, bạn có thể dùng syntax sau mà không cần phải overload operator gì cả. Ví dụ:
    C++ Code:
    1.  
    2. #include <iostream>
    3.  
    4. using namespace std;
    5.  
    6. class fraction {
    7. public:
    8.     fraction(int n, int d) :n(n), d(d) {
    9.  
    10.     }
    11.  
    12.     friend ostream& operator <<(ostream& out, const fraction& obj) {
    13.         return obj.print(out);
    14.     }
    15.  
    16. private:
    17.     int n;
    18.     int d;
    19.  
    20. private:
    21.     ostream& print(ostream& out) const {
    22.         return out << n << "/" << d;
    23.     }
    24. };
    25.  
    26. int main() {
    27.     fraction f(10, 5); 
    28.     cout << f << endl;
    29.     f = {1, 2};
    30.     cout <<  f << endl;
    31. }

    Command
    Code:
    g++ prog.cp -o prog -std=c++0x
    Đã được chỉnh sửa lần cuối bởi rox_rook : 26-03-2012 lúc 05:54 AM.

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Em cũng đã nghĩ đến cách đó rồi, nhưng nếu như vậy thì khi có ai đó viết:
    Code:
    f = 1, 2, 3, 4;
    thì f = 1/4, khá là vô nghĩa.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ừ, thực ra anh cũng đã có coi qua cách của em và đã thử evaluate hơn 2 đối. Tuy vậy, cách tốt nhất vẫn phải là ngăn user không cho sử dụng 3 đối ở compiler time thì vẫn tốt hơn. Vì dù sao đi nữa user cũng không thể biết qui luật đối nào được nhận trừ phi API ghi rõ ra. Có lẽ cách C++11 vẫn là đẹp nhất

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Mặc định Sử dụng toán tử operator thay thế cho phép gán ?

    Việc tính nhiều biểu thức cách nhau bằng dấu , là khá bình thường, nên cũng không việc gì phải ngăn cả.
    Dù sao thì C++11 vẫn là đơn giản nhất. Mà bây giờ gcc 4.7 đã chính thức ra mắt rồi cho nên câu lệnh biên dịch có thể thay bằng -std=c++11 (đẹp hơn) chứ không cần -std=c++0x như trước nữa.

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Việc tính nhiều biểu thức cách nhau bằng dấu , là khá bình thường, nên cũng không việc gì phải ngăn cả.
    Vậy nếu em gọi:
    C++ Code:
    1. f = 1, 2, 3, 4, 5;
    Trong khi f là phân số, vậy semantic của câu lệnh trên thế nào rõ nghĩa? Trong cuốn More Effective C++ của Scott Meyers, chúng ta không bao giờ khuyến khích quá tải toán tử ",". Nếu trong bài này, anh sẽ dùng cascading: numerator(a).denominator(b).
    Anh đang dùng Windows, bản của anh 4.6.2, vì vậy anh vẫn phải dùng -std=c++0x.
    C++ Code:
    1.  
    2. #include <iostream>
    3.  
    4. using namespace std;
    5.  
    6. class fraction {
    7. public:
    8.     fraction(int n, int d)
    9.         :n(n), d(d) {
    10.  
    11.     }
    12.  
    13.     fraction& numerator(int num) {
    14.         n = num;
    15.         return *this;
    16.     }
    17.  
    18.     fraction& denominator(int den) {
    19.         d = den;
    20.         return *this;
    21.     }
    22.  
    23.     friend
    24.     ostream& operator <<(ostream& out, const fraction& obj) {
    25.         return obj.print(out);
    26.     }
    27.  
    28. private:
    29.     int n;
    30.     int d;
    31.  
    32. private:
    33.     ostream& print(ostream& out) const {
    34.         return out << n << "/" << d;
    35.     }
    36. };
    37.  
    38. int main() {
    39.     fraction f(1, 2);  
    40.     f.numerator(4).denominator(5);
    41.     cout << f << endl;
    42. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 26-03-2012 lúc 07:23 AM.

Các đề tài tương tự

  1. Kỹ thuật C++ Cách hoạt động của operator trong C++ như thế nào?
    Gửi bởi bahamut3000 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 26-08-2011, 11:27 PM
  2. Hàm operator >> và << có tác dụng như thế nào?
    Gửi bởi tamkute92 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-03-2011, 11:12 PM
  3. Bitwise operator được sử dụng như thế nào?
    Gửi bởi hura trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-02-2011, 03:58 PM
  4. thắc mắc về operator - ai bết chỉ giùm
    Gửi bởi sky_night trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 31-10-2010, 01:18 AM
  5. Thắc mắc cách sử dụng đa hình cho operator
    Gửi bởi itleo31 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 03-06-2010, 09:57 PM

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