Распечатать массив, состоящий из строки и целого числа, без использования функции в cpp-файле

#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. Спасибо! я ищу некоторую информацию о конструкторе, потому что я немного запутался в примечаниях, приведенных моим лектором