ошибка: нестатический ссылочный член ‘std :: ostream & amp; Student :: out ‘, не может использовать оператор по умолчанию

Я начинающий программист на C ++ и, работая над кодом, столкнулся с этой ошибкой:

C:\Users\Matt\Desktop\C++ Projects\OperatorOverload\students.h|8|error: non-static reference member 'std::ostream& Student::out', can't use default assignment operator|

Ошибка была для строки 8 этого заголовочного файла:

#ifndef STUDENTS_H
#define STUDENTS_H

#include <string>
#include <vector>
#include <fstream>

class Student {
private:
std::string name;
int credits;
std::ostream& out;

public:
// Create a student with the indicated name, currently registered for
//   no courses and 0 credits
Student (std::string studentName);

// get basic info about this student
std::string getName() const;
int getCredits() const;

// Indicate that this student has registered for a course
// worth this number of credits
void addCredits (int numCredits);
void studentPrint(std::ostream& out) const;};
inline
std::ostream& operator<< ( std::ostream& out, const Student& b)
{
b.studentPrint(out);
return out;
}
bool operator== ( Student n1, const Student&  n2)
{

if((n1.getCredits() == n2.getCredits())&&(n1.getName() == n2.getName()))
{
return true;
}
return false;
}
bool operator< (Student n1, const Student& n2)
{
if(n1.getCredits() < n2.getCredits()&&(n1.getName() < n2.getName()))
{
return true;
}
return false;
}

#endif

Дело в том, что я не совсем уверен, что означает ошибка, и не знаю, как ее исправить. У кого-нибудь есть возможное решение?

1

Решение

Проблема с кодом, очевидно, std::ostream& член в вашем классе. Семантически, я сомневаюсь, что на самом деле имеет смысл иметь этого члена. Тем не менее, давайте предположим, что вы хотите сохранить его. Есть несколько последствий:

  1. Любой пользовательский конструктор должен явно инициализировать ссылку в своем списке инициализатора члена. В противном случае компилятор откажется принять конструктор.
  2. Компилятор не сможет создать оператор присваивания, потому что он не знает, что должно произойти при назначении ссылки.

Похоже, что сообщение об ошибке касается оператора присваивания. Вы можете обойти эту проблему, определив оператор присваивания явно, например,

Student& Student::operator= (Student const& other) {
// assign all members necessary here
return *this;
}

Тем не менее, лучшим решением будет отказаться от ссылочного параметра. Вам, вероятно, все равно это не нужно: есть несколько классов, для которых имеет смысл хранить std::ostream& член. В большинстве случаев любой поток является эфемерной сущностью, временно используемой для отправки или получения объектов.

1

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

Где-то в вашем коде вы используете оператор присваивания на одном из ваших Student объекты. Но вы специально не определили оператор присваивания, вы просто используете сгенерированный компилятором оператор. Но сгенерированный компилятором оператор присваивания не работает, когда у вас есть ссылочные члены. Либо отключите оператор присваивания (сделав его закрытым, либо удалив его), либо сделайте член ostream указателем, а не ссылкой. Все это предполагает, что вам действительно нужен этот объект ostream в вашем классе, что я считаю подозрительным.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector