Trong một dự án tôi đang làm việc, tôi có một lớp học Score
, được định nghĩa bên dưới trong score.h
. Tôi đang cố gắng để quá tải nó như vậy, khi một hoạt động <<
được thực hiện trên nó, _points + " " + _name
được in.các chức năng 'người bạn' và << quá tải toán tử: Cách thích hợp để quá tải một toán tử cho một lớp là gì?
Đây là những gì tôi đã cố gắng để làm:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
Dưới đây là các lỗi trả về:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
(Lỗi này xuất hiện 4 lần, trên thực tế)
tôi quản lý để làm cho nó làm việc bằng cách tuyên bố tình trạng quá tải là chức năng của bạn bè:
friend ostream & operator<< (ostream & os, Score right);
Và xóa Score::
khỏi khai báo hàm trong score.cpp (có hiệu quả không khai báo nó làm thành viên).
Tại sao tính năng này hoạt động, nhưng đoạn mã cũ không?
Cảm ơn bạn đã dành thời gian!
EDIT
Tôi đã xóa tất cả đề cập đến tình trạng quá tải về các tập tin tiêu đề ... nhưng tôi nhận được (chỉ và) lỗi sau. binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or there is no acceptable conversion)
Làm thế nào để kiểm tra của tôi, trong chính(), không thể tìm thấy tình trạng quá tải thích hợp? (Nó không bao gồm, tôi đã kiểm tra)
Dưới đây là toàn bộ score.h
#ifndef SCORE_H_
#define SCORE_H_
#include <string>
#include <iostream>
#include <iostream>
using std::string;
using std::ostream;
class Score
{
public:
Score(string name);
Score();
virtual ~Score();
void addPoints(int n);
string scoreGetName() const;
int getPoints() const;
void scoreSetName(string name);
bool operator>(const Score right) const;
private:
string _name;
int _points;
};
#endif
Nice, câu trả lời hoàn chỉnh. –
Truy cập phần riêng tư của lớp học - Rawr. J/K, cảm ơn bạn rất nhiều, nhưng vẫn còn một câu hỏi: Tôi đã xóa tất cả các đề cập đến quá tải trên tệp tiêu đề ... nhưng tôi nhận được lỗi sau (và chỉ). 'nhị phân' << ': không tìm thấy toán tử nào có toán hạng bên phải của loại' Điểm '(hoặc không có chuyển đổi được chấp nhận)' Làm thế nào để thử nghiệm của tôi, trong chính(), không thể tìm thấy quá tải? (nó không phải là bao gồm). –
Bạn nên đặt khai báo 'toán tử <<' ngay với định nghĩa lớp của bạn: đó là trong cùng một tiêu đề và trong cùng một không gian tên. Bằng cách này bạn sẽ không quên bao gồm nó và bạn trình biên dịch sẽ có thể nhặt nó lên khi tìm kiếm quá tải chấp nhận được. –