В UserProfile.h я объявил класс UserProfile...
#include <iostream>
#include <map>
#include <string>
using namespace std;
class UserProfile
{
...
}
тогда я определил функцию UserProfile() и оператор << в UserProfile.cpp
#include "UserProfile.h"
#include <cstdlib>
inline UserProfile::UserProfile()
: _login("guest"), _user_level(Beginner),
_times_logged(1), _guesses(0), _correct_guesses(0)
{
static int id = 0;
char buffer[16];
_itoa(id++, buffer, 10);
_login += buffer;
}
...
ostream& operator<<(ostream &os, const UserProfile &rhs)
{
os << rhs.login() << ' '
<< rhs.level() << ' '
<< rhs.login_count() << ' '
<< rhs.guess_count() << ' '
<< rhs.guess_correct() << ' '
<< rhs.guess_average() << endl;
return os;
}
Однако, когда я пытаюсь скомпилировать их, ошибка отчета g++:
g++ UserProfile.cpp E44.cpp -o main
UserProfile.cpp: In constructor ‘UserProfile::UserProfile():
UserProfile.cpp:11:27: error: ‘_itoa was not declared in this scope
_itoa(id++, buffer, 10);
Но я включил "cstdlib"... так странно...
Кроме того, когда я хочу использовать << в моей основной cpp, ошибка отчета g++ тоже:
#include "UserProfile.h"
int main()
{
UserProfile anon;
cout << anon;
...
}
g++ доклад:
E44.cpp: In function ‘int main():
E44.cpp:6:10: error: no match for ‘operator<< (operand types are ‘std::ostream {aka std::basic_ostream<char>} and ‘UserProfile)
cout << anon;
Я так запутался... Я сделал что-то не так?
Правильное название функции itoa не _itoa. Однако он не может использоваться в C++. cplusplus.com говорит:
Эта функция не определена в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами.
Вместо этого используйте std :: to_string или строковые потоки.
Что касается ошибки времени компиляции в отношении оператора <<, то это потому, что вы определяете оператор в другой единицы перевода, чем тот, который имеет основную функцию, которая будет скомпилирована отдельно, я думаю, и вы не объявляете ее в файле заголовка, Для этого вам нужно объявить перегруженный оператор, желательно в том же заголовочном файле, что и заголовочный файл класса UserProfile.h.
ostream& operator<<(ostream &os, const UserProfile &rhs);
Кроме того, вы можете сделать его другом своего класса для прямого доступа к полям и не использовать методы. Это не разрушает инкапсуляцию, потому что вы реализуете как класс, так и перегруженный оператор.
class UserProfile
{
friend ostream& operator<<(ostream &os, const UserProfile &rhs);
};