Ошибка: error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Kniga' [требует правки]

394
30 декабря 2016, 11:34

Компилятор ругается на ошибку

Error   5   error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Kniga' 

Исходная задача: Создать 2 класса: класс Книга и класс СписокКниг.

  1. Напиши класс Kniga, private: char *avtor, char *nazwa
  2. Напиши конструктор. Внимание, здесь мы имеем указатели на массив, потому конструктор должен создать массив и копировать текст.
  3. Напиши конструктор по умолчанию, который инициализирует указатели как NULL(0)
  4. Напиши конструктор копирования. Создает массив и копирует текст.
  5. Напиши метод vypishy, которая выводит на экран элементы класса.
  6. Напиши деструктор.
  7. Напиши класс SpisokKnig, private: knigi - указатель на массив типа Kniga, skolkoKnig - сколько книг в списку, maxKnig - максимальная длина массива.
  8. Конструктор класса SpisokKnig (принимает 1 параметр - длину массива). Конструктор создает динамический массив. Какой конструктор класса Kniga здесь сработает?
  9. Напиши метод dobavitKnigu - с параметром класса Kniga, который в первую свободную ячейку массива запишет новую книгу .
  10. Напиши метод vypisyVse - выводит на экран все книги.

Вот код, возможно что-то в другом месте написал не правильно и потому не компилируется код.

#include "stdafx.h"
#include "iostream"
using namespace std;
class Kniga{
private: char *autor;
         char *nazva;
public: Kniga(char *, char *);
        Kniga();
        Kniga(const Kniga &);
        void vypishy();
        ~Kniga();
};
Kniga::Kniga(char *konstr_autor, char *konstr_nazva){
    autor = new char[strlen(konstr_autor) + 1];
    strcpy(autor, konstr_autor);
    nazva = new char[strlen(konstr_nazva) + 1];
    strcpy(nazva, konstr_nazva);
}
Kniga::~Kniga(){
    delete[] autor;
    delete[] nazva;
}
Kniga::Kniga(){
    autor = NULL;
    nazva = NULL;
}
Kniga::Kniga(const Kniga &kniga){
    autor = new char[strlen(autor) + 1];
    strcpy(autor, kniga.autor);
    nazva = new char[strlen(nazva) + 1];
    strcpy(nazva, kniga.nazva);
}
void Kniga::vypishy(){
    if (autor != NULL && nazva != NULL)
    {
        cout << "Autor: " << autor << endl;
        cout << "Nazva: " << nazva << endl;
    }
}
class SpisokKnig{
    int maxKnig;
    Kniga *knigi;
    static int skolkoKnig;
public:
    SpisokKnig(int);
    void dobavitKnigu(char *aut, char *naz);
    void vypishyVse();
};
int SpisokKnig::skolkoKnig = 0;
SpisokKnig::SpisokKnig(int maxKn){
    maxKnig = maxKn;
    knigi = new Kniga[maxKnig];
}
void SpisokKnig::dobavitKnigu(char *aut, char *naz){
    knigi[skolkoKnig] = Kniga(aut, naz);
    skolkoKnig++;
}
void SpisokKnig::vypishyVse(){
    for (int i = 0; i < skolkoKnig; i++)
        cout << knigi[i] << endl;   //ругается здесь
}
int _tmain(int argc, _TCHAR* argv[])
{
    Kniga kniga("Jack Back", "My Book");
    SpisokKnig spisok(3);
    spisok.dobavitKnigu("Nick Tirik", "New book");
    spisok.dobavitKnigu("Vova Mill", "Vova's life");
    spisok.vypishyVse();
    system("pause");
    return 0;
}
Answer 1

Ну допишите этот оператор, типа

class Kniga{
private: char *autor;
         char *nazva;
public: Kniga(char *, char *);
        Kniga();
        Kniga(const Kniga &);
        void vypishy();
        ~Kniga();
        friend ostream& operator << (ostream& os, const Kniga& k);
};
ostream& operator << (ostream& os, const Kniga& k)
{
    return os << "(" << k.author<< " : " << k.nazva << ")";
}
READ ALSO
Как запустить функцию в потоке (DLLMain)?

Как запустить функцию в потоке (DLLMain)?

ПриветствуюЕсть некая функция, которая получает хеш-сумму файла (exe) и записывает ее в файл

368
Как организовать структуру базы данных?

Как организовать структуру базы данных?

Есть БД usersВ одной из таблиц есть поля login, password, id

453
Primary key по двум столбцам MySQL

Primary key по двум столбцам MySQL

ЗдравствуйтеПредположим, есть таблица со столбцами user_id и user_group, остальные столбцы не важны

361