【问题标题】:Having trouble getting my overloaded insertion operator to work无法让我的重载插入运算符工作
【发布时间】:2018-03-27 08:11:29
【问题描述】:

这是我的主要功能

int main()
{
    const string filename = "ass10data.txt";   // use your filename here
    ifstream fin(filename.c_str());
    if (!fin)
    {
        cerr << "Unable to open " << filename << endl;
        exit(1);
    }
    string buffer;
    Quadrilateral* ptrQuad;
    while (getline(fin,buffer))
    {
        // Process only valid input
        if (buffer.size() > 1)
        {
            ptrQuad = createQuadrilateralFromString(buffer);
            cout << *ptrQuad << endl;
            delete ptrQuad;
        }
    }
    fin.close();
}

这是重载的插入操作符

ostream& operator<<(ostream&out, Quadrilateral *pointerQuad)
{
    if (pointerQuad->getType() == "rectangle")
    {
        out << "Rectangle: sides " << pointerQuad->getFirst() << " and " << pointerQuad->getSecond() << " area=" << pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "square")
    {
        out << "Square: side "<< pointerQuad->getFirst() << " area="<< pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "parallelogram")
    {
        out << "Parallelogram: sides " << pointerQuad->getFirst() << " and " << pointerQuad->getSecond() << " area=" << pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "rhombus")
    {
        out << "Rhombus: side "<< pointerQuad->getFirst() << " area="<< pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else
        return out;
}

我收到一条错误消息,提示“'operator

【问题讨论】:

  • *ptrQuad 不是指针。请使用智能指针。
  • 查找规范形式。

标签: c++


【解决方案1】:

插入运算符应该对Quadrilateral 进行常量引用,而不是指向它的指针:

ostream& operator<<(ostream&out, Quadrilateral const &pointerQuad)

当然,这意味着你的函数应该使用值语法,而不是指针。

if (pointerQuad.getType() == "rectangle")
{
    out << "Rectangle: sides " << pointerQuad.getFirst() << " and " << pointerQuad.getSecond() << " area=" << pointerQuad.area();
    out << " perimeter=" << pointerQuad.perimeter();
    return out;
}
[...]

【讨论】:

  • 这很有意义,但是在进行这些更改后我仍然遇到同样的错误。我很困惑
  • 我为您的问题创建了一个虚拟实现。这编译:godbolt.org/g/C7HaH9。请确保在构建之前已保存所有文件。
  • 我不想打扰你太多,但你能看看我的代码吗?我做了你建议的所有更改,但由于某种原因它仍然无法编译godbolt.org/g/5bFU8h
  • 没问题。你少了一个字符。 ostream&amp; operator&lt;&lt;(ostream&amp;out, Quadrilateral *pquad); 是您的前向声明。只需将其更改为 ostream&amp; operator&lt;&lt;(ostream&amp;out, Quadrilateral &amp;pquad); 即可:godbolt.org/g/iw4aM3
  • 没问题。如果其他人在插入操作员的签名上有问题,请随时接受作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2012-08-10
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多