Ошибка E0963. Класс ругается на конструктор

137
28 июля 2022, 12:00

Возникла проблема с кодом, не знаю, как ее решить. Пишет, что нельзя указывать тип возвращаемого значения для конструктора. На всякий случай сообщу, что мне необходимо, чтоб оно мониторило book[1] на поиск слова "Program" и в случае, если найдет, выводило дату и автора (book[2],book[3]).

#include <iostream>
#include <string>
using namespace std;
class Book{
private:
    string book[3][16];
public:
    Book();
    void founder() {};
}
Book::Book() {
    string book[3][16] = {
    {"Program","Program","Something","Noting","","Program","Noting","Something","Something","Anything","Program","Noting","Noting","Something","Noting","Program"},
    {"12.03.2004","12.03.2009","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003"},
    {"Jack","Jack","George","George","George","George","Jack","George","George","George","Jack","George","George","Jack","George","Jack"}
    };
};
void Book::founder() {
    int i;
    for(i = 1; i <= 16; i++) {
        if (book[1][i] == "Program"){cout << "Date: " << book[2][i] << "Autor: " << book[3][i] << endl; };
    };
};
void main() {
    Book b;
    b.founder();
}
Answer 1

Если ваш код в точности такой, то по сути у вас написано

class Book {...} Book::Book(){}

Т.е. объявлен конструктор, возвращающий этот самый class Book. А конструктор ничего возвращать не должен... Итак, нужна точка с запятой после объявления класса.

После этого компилятор совершенно справедливо поясняет, что book в конструкторе скрывает имя book в классе - т.е. то, что вы написали в конструкторе

Book::Book() {
    string book[3][16] = {

не имеет никакого отношения к полю book в классе, которое так и остается не инициализированным.

Исправляем -

Book::Book():book{
    {"Program","Program","Something","Noting","","Program","Noting","Something","Something","Anything","Program","Noting","Noting","Something","Noting","Program"},
    {"12.03.2004","12.03.2009","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003","12.03.2003"},
    {"Jack","Jack","George","George","George","George","Jack","George","George","George","Jack","George","George","Jack","George","Jack"}
}
{
};

Теперь выползает очередная ошибка - что ваша void Book::founder() уже имеет текст реализации - и в самом деле, ведь в классе вы ее не просто объявили, а определили, как имеющую пустое тело. А теперь - непустое. Компилятор на ruSO не участвует, понимать, что программист хотел, не умеет. Исправляем и эту ошибку, убирая {} у функции в объявлении класса.

Теперь компилятору не нравится void у main() - и его можно понять: стандарт ведь требует int.

И вот только после этого код компилируется.

Но, скорее всего, не работает (хотя, может, вы хотели именно этого - пишете же, что "мониторить book[1] надо, т.е. искать "Program" среди дат...). Хотя бы потому, что все элементы массивов нумеруются с 0, так что вы благополучно опускаете первый элемент, а в цикле выходите за пределы массива. И сравниваете, кстати, вторую строку массива book, с датами...

И только переписав цикл как

for(int i = 0; i < 16; i++) {
    if (book[0][i] == "Program")
        cout << "Date: " << book[1][i] << " Autor: " << book[2][i] << endl;
};

мы получим какой-то вывод.

Итак, у вас как минимум 4 ошибки. Причем о трех из них, которые мешали компиляции, компилятор сообщал вполне доступным языком...

READ ALSO
Решение задачи на merge_sort на с++

Решение задачи на merge_sort на с++

Возникли проблемы со следующей задачей:

65
установка sfml под atom

установка sfml под atom

Просьба подсказать как работать с sfml под atom:

84
SFML: Многопоточная отрисовка Спрайтов

SFML: Многопоточная отрисовка Спрайтов

Подскажите пожалуйста, как отрисовать спрайт, с использованием потоков в SFML?

71