Переопределение оператора & lt; & lt; в переполнении стека

Я знаю, что этот вопрос может быть глупым, но я новичок в C ++, и у меня много проблем с переопределением операндов.
То, что я пытаюсь сделать, это переопределить операнд << напечатать информацию моего класса «Person», но появляется ошибка компиляции:

class Person {
private:
string name;
unsigned long personId;
string address;
public:
Person(string name2,unsigned long id,string adr) {
name = name2;
personId = id;
address = adr;
}
void operator<<(Person person) {
cout<<"Name: "<<person.name<<"  Person ID:  "<<person.personId<<"  Person address:  "<<person.address<<endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
Person person("Steven",1212121212,"USA");
cout<<person; //compiling error here

return 0;
}

Какой правильный способ сделать это?

0

Решение

Прежде всего определение класса должно заканчиваться точкой с запятой.

class Person {
// ...
};

Во-вторых, вы говорите о перегрузке оператора, а не операнда.

оператор << это бинарный оператор, который применяется к двум операндам. Если вы хотите перегрузить этот оператор для стандартного выходного потока и вашего класса, вам следует указать в качестве первого параметра стандартный выходной поток. Также намного лучше передать объект вашего класса по константной ссылке. Так что декларация будет выглядеть как

std::ostream & operator <<( std::ostream &os, const Person &person );

Чтобы этот оператор мог обращаться к членам данных вашего класса, которые определены как частные, он должен быть объявлен как функция друга класса или имеет доступ к открытым методам класса, которые предоставляют доступ к закрытым членам данных.

Например

class Person {
private:
string name;
unsigned long personId;
string address;
friend std::ostream & operator <<( std::ostream &os, const Person &person );

public:
Person(string name2,unsigned long id,string adr) {
name = name2;
personId = id;
address = adr;
};

Или же

class Person {
private:
string name;
unsigned long personId;
string address;
ostream & out( std::ostream &os ) const;

public:
Person(string name2,unsigned long id,string adr) {
name = name2;
personId = id;
address = adr;
};

а также

 std::ostream & operator <<( std::ostream &os, const Person &person )
{
return ( person.out( os ) );
}
2

Другие решения

operator << является бинарным оператором, поэтому первым параметром для него должна быть ссылка на std::ostream возражать в вашем случае. Поскольку ваши переменные являются частными — вы не можете перегружать operator << как свободная функция. Первым параметром для функции класса является указатель на объект этого класса, поэтому вы должны использовать friend Спецификатор (который предоставляет доступ к закрытым переменным вашего класса) для функции.

friend ostream& operator << (ostream& os, const Person& person)
{
os << "Name: "<< person.name << "  Person ID:  "<< person.personId << "  Person address:  " << person.address << endl;
return os;
}
6

По вопросам рекламы [email protected]