打印输出函数C ++时出错

时间:2018-04-29 01:36:44

标签: c++ function inheritance

我目前正在为学校做一个计划,这是我第一次使用遗产。我的问题是我在尝试打印时从Visual Studio中收到这些错误。 C2296:<<非法的,左操作数的类型为' const char [7]' 和 C2297:<<非法,右操作数的类型为' const std :: string *'

我的打印行是:

    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,因此它被注释掉了。 当我带走他们的&amp;&#;;时,我会得到更多的错误 任何帮助都会非常感激,我一直坐在这里经过几个小时,但不能绕过它。

1 个答案:

答案 0 :(得分:1)

  

我的打印行是:

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本身的地址。

<强>更新

您可以在任意位置超载operator<<。如果它不会访问该类的friend部分,则它不需要是private函数。鉴于Statusenum 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;
}