#c
#c
Вопрос:
У меня есть этот код в файле .cpp, и мне не разрешено редактировать код в этом файле.
#ifndef CP_MEMBER_H
#define CP_MEMBER_H
#include <iostream>
#include <string>
class CP_Member
{
public:
string m_name;
int m_age;
public:
CP_Member() {
m_name = "?";
m_age = 0;
}
CP_Member(string name, int age) : m_name(name), m_age(age) {}
friend ostreamamp; operator<< (ostreamamp; os, const CP_Memberamp; a);
};
ostreamamp; operator<< (ostreamamp; os, const CP_Memberamp; a) {
os << "Name:" << a.m_name << " Age: " << a.m_age;
return os;
}
#endif
#pragma once
Я записал их только в свой файл .h.
Комментарии:
1. Никто не просит вас печатать массив. Это уже делается в main. То, что вас просят сделать, это распечатать
CP_Member
объект.
Ответ №1:
Поскольку main
файл уже выполняет
cout << newCommers[i] << endl;
Вам просто нужно убедиться, что он выполняет то, что вы хотите. Поскольку newCommers[i]
это CP_Member
, вы контролируете все в нем, включая то, что происходит при использовании operator<<
на нем. Как это контролировать, должно быть в ваших лекционных заметках, и вы можете исследовать проблему с «перегрузкой оператора<<«.
Комментарии:
1. Я попытался перегрузить метод << operator после поиска некоторой информации, но я продолжаю получать сообщение об ошибке: при попытке сопоставить список аргументов ‘(std::ostream, CP_Member). что-то не так с моим конструктором или ..?
2. @John попробуйте добавить
friend
к перегрузке вашего оператора.3. @John, @Rohan правильно. Поскольку первым аргументом
CP_Member
являетсяostream
(cout << newCommers[i]
,cout
являетсяostream
и первым, иnewCommers[i]
вторым), эта функция не может быть методомCP_Member
. Скорее вы объявляете его как дружественную функцию (это еще одна вещь, на изучение которой стоит потратить время) и заставляете ее сначала приниматьstd::ostream
, а затем ваш объект.4. Я вижу.. я отредактировал свой код, но все еще получаю ту же ошибку.. Я рассмотрю использование функции friend.
5. Хорошо .. я поместил файл .h в исходные файлы, тогда как он должен быть в файлах заголовков… спасибо всем за помощь! Действительно ценю это!
Ответ №2:
Вам нужно определить friend ostreamamp; operator<<
, потому что это используется в cout
инструкции:
friend ostreamamp; operator<<(ostream amp;out, const CP_Member amp;mem)
{
return out << "Name: " << mem.m_name << " Age: " << mem.m_age;
}
После этого программа выводит:
Zhang San 22
Li Si 19
Wang Wu 18
Zhao Liu 24
? 0
Кроме того, вы могли бы использовать список инициализации для построения:
CP_Member(string name, int age) : m_name(name), m_age(age) {
std::cout << "Object constructed."; // Optional syntax
}
Комментарии:
1. Спасибо! я ищу некоторую информацию о конструкторе, потому что я немного запутался в примечаниях, приведенных моим лектором