Chưa thử định nghĩa chồng toán tử kiểu này bao giờ nhưng có lẽ là được dù có khó khăn nhất định , iamvtn viết một hàm định nghĩa chồng ở ngoài sau đó khai báo trong lớp là friend .... như thế là được rồi ?
VD trong lớp Điểm đơn thuần thế này.
C++ Code:
#include <iostream.h> #include <conio.h> #include <math.h> class diem { private: float x; float y; public: diem() { x=0; y=0; }; diem(float a,float b) { x=a;y=b; }; void settung(float t); float gettung(); void sethoanh(float h); float gethoanh(); void setdiem(diem j); float KC(diem k); void show(); }; void diem::settung(float t) { x=t; }; float diem::gettung() { return x; }; void diem::sethoanh(float h) { y=h; }; float diem::gethoanh() { return y; }; void diem::setdiem(diem j) { x=j.x; y=j.y; }; float diem::KC(diem k) { return sqrt((x-k.x)*(x-k.x)+(y-k.y)*(y-k.y)); }; void diem::show() { };
Mình muốn dùng quá tải (operator) để quá tải toán tử xuất << . Để có thể xuất thẳng một đối tượng ra mà không cần dùng hàm hiện thị nữa mà ko biết làm thế nào. Mọi người dúp nhá.
Ôi chết mình gửi nhầm box ai đó move sang phần hỏi đáp dúp mình
Đã được chỉnh sửa lần cuối bởi kidkid : 15-05-2007 lúc 10:16 PM.
Chưa thử định nghĩa chồng toán tử kiểu này bao giờ nhưng có lẽ là được dù có khó khăn nhất định , iamvtn viết một hàm định nghĩa chồng ở ngoài sau đó khai báo trong lớp là friend .... như thế là được rồi ?
Bài này chắc cũng lâu rùi, chắc lúc này iamvtn cũng mới học nhỉ T_T! Mình sữa lại cho 1 số bạn mới học xem vậy :
Pass stream cout vào cũng được :
Ví dụ gọi hàm thì :PHP Code:void Show(ostream &oss) const;
{
oss << "(" << x << " " << y << ")";
}
Hoặc dùng friend quá tải stream <<PHP Code:diem Obj;
Obj.Show(cout);
PHP Code:ostream &operator <<(ostream &oss, diem const &c)
{
oss << "(" << x << " ; " << y << ")";
return oss;
}
đối với xuất đối tượng trong c++ thì tốt nhất và chuẩn nhất là dùng toán tử operator dùng như sau !
Code:xuất : friend ostream & operator << (ostream &OutDev,LDiem ) nhập : friend istream &operator >>(istream &InDev,LDiem & )
Tình Này Mãi Chao Về Em ......
Theo mình thì để định nghĩa toán tử << hay >> thì dùng như sau
istream& operator>>(istream&);
ostrema& operator<<(ostream&);
Anh RR giải thích cho em tại sao phải truyền theo kiểu tham chiếu ko ? Dùng kiểu tham trị truyền có được ko ?ostream &operator <<(ostream &oss, diem const &c)
{
oss << "(" << x << " ; " << y << ")";
return oss;
}
Cú pháp nó là như vậy, đây là cú pháp mặc định mà.
Em thì đoán là do ta đã return ra oss tức là trả về tham chiếu của đối tượng cout nên bắt buộc cái oss mà ta truyền vào cũng phải theo kiểu tham chiếu để có thể "bắt chính xác" đối tượng cout . Ko biết đúng sai ???
ostream &operator <<(ostream &oss, diem const &c)
{
oss << "(" << x << " ; " << y << ")";
return oss;
}
Toán tử << là shift left, trong C++ thì toán tử này đã được overload lại rồi, đọc về lớp istream và ostream sẽ hiểu.
ostream cơ bản cũng là 1 lớp, vậy oss là đối tượng, chẳng có gì mặc định là tham chiếu cả, dùng con trỏ vẫn được. Tuy nhiên phần I/O của C++ không đơn giản, mới học đọc vào thì freak-out là cái chắc. Tham trị thì chắc chắn là không được, vì nếu tạo bản sao của đối tượng thì làm sao chỉnh sửa được nó???
Xài kiểu friend quá tải kiếu đó rất dễ error prone ví dụ ta thêm vào chi tiếp của thư viện I/0 manipulator ( #include <iomanip> )
std::cout << std::left << anObject << setw(8) << bOject;
sẽ thấy ngay ra kết quả sai. Thao tác của show dù gì cũng an toàn hơn. Nếu xài friend thì phải dùng viết theo kiểu template thao tác trực tiếp trên đối tượng ostream luôn ( phần này thì không dễ, cứ từ từ học sẽ hiểu ). Nếu cần ví dụ anh sẽ đưa.