Ошибка с распечаткой функций C ++ - PullRequest
0 голосов
/ 29 апреля 2018

В настоящее время я делаю программу для школы и впервые использую в ней наследование. Моя проблема в том, что я получаю эти ошибки из Visual Studio при попытке распечатать. C2296: << недопустимо, левый операнд имеет тип 'const char [7]' а также C2297: << недопустимый, правый операнд имеет тип 'const std :: string *' </p>

моя печатная строка:

    string printOutput = "Book #" << &getCallNumber() << ", title: " << &getTitle() << " by " << &getAuthor() << " pages: " << getNumPages() << ", status: " << getStatus() << ", fees: " /*<< getFees()*/;

и определения функций следующие:

    const string &getCallNumber() const {
    return callNumber;
}

    const string &getTitle() const {
    return title;
}

    const string &Book::getAuthor() const 
{
    return author;
}

    int Book::getNumPages() const 
{
    return numPages;
}

    Status getStatus() const {
    return status;
}

Я еще не определил getFees, поэтому, почему он закомментирован. Когда я забираю у них & & я получаю еще больше ошибок Буду очень признателен за любую помощь, я сидел здесь часами, просматривая ее, но просто не могу обернуть голову вокруг нее.

1 Ответ

0 голосов
/ 29 апреля 2018

моя печатная строка:

string printOutput = "Book #" << &getCallNumber() << ", title: " << &getTitle() << " by " << &getAuthor() << " pages: " <<
> getNumPages() << ", status: " << getStatus() << ", fees: " /*<<
> getFees()*/;

В C ++, если вы хотите что-то напечатать, вы можете просто std::cout это (учитывая, что вещи, которые вы хотите распечатать, перегружены operator<< для ostream) - Нет необходимости создавать объект string первый

std::cout << "Book #" << getCallNumber() << ", title: " << getTitle() << " by " 
<< getAuthor() << " pages: " << getNumPages() << ", status: " << getStatus() << ", fees: ";

И поскольку getStatus() возвращает Status, вы должны убедиться, что класс Status перегружен operator << для ostream. Обратите внимание, что знак & спереди отсутствует - при добавлении & будет взят адрес string, а не самого string.

UPDATE

Вы можете перегрузить operator<< где угодно. Это не обязательно должна быть функция friend, если она не будет обращаться к части private класса. И учитывая, что Status является enum class, я бы полагал, что перегрузка его выше main будет достаточной. И учитывая

enum class Status { AVAILABLE, ON_LOAN, PROCESSED, MISSING, OVERDUE, };

Вы можете сделать что-то вроде

ostream& operator<<(ostream& os, Status s) {
    switch(s)
    {
        case Status::AVAILABLE:
            os << "AVAILABLE";
            break;
        case Status::ON_LOAN: 
            os << "ON_LOAN";
            break;
        ....//And do the same thing for the other cases

    }
    return os;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...