如何重载ostream<<运算符与数组?

时间:2011-10-29 03:50:39

标签: c++ arrays overloading operator-keyword ostream

我无法重载我的<< operator用于打印未知大小的数组的内容。我搜索了一个解决方案,但我找到的唯一一个解决方案是要求我将所有私有数据成员放在一个结构中(这对我来说似乎有点不必要)。我无法编辑该函数使其成为朋友或将* q更改为& q(或const)。

这是我的<<过载代码:

ostream& operator<<(ostream& out, Quack *q)
{
    if (q->itemCount() == 0)
        out << endl << "quack: empty" << endl << endl;
    else
    {
        int i;
        int foo;
        for (int i = 0; i < q->itemCount(); i++ )
        {
            foo = (*q)[i];
            out << *(q + i);
        } // end for
        out << endl;
    }

    return out;
}

以下是我的私人数据成员:

private:
int     *items;                     // pointer to storage for the circular array.
                                    // Each item in the array is an int.
int     count;
int     maxSize;
int     front;
int     back;

以下是调用函数的方法(无法编辑):

    quack = new Quack(QUACK_SIZE);
    //put a few items into the stack
    cout << quack;

以下是输出格式的格式:

quack: 1, 2, 3, 8, 6, 7, 0

如果数组为空,则

quack: empty

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

另一种选择是重定向到成员函数,如下所示:

void Quack::printOn(ostream &out) const
{
    out << "quack: ";
    if(count == 0)
        out << "empty";
    else 
    {
        out << items[0];
        for ( int i = 1 ; i < count ; i++ )
        {
            out << ",  " << items[i];
        }
    }
    out << "\n";
}

ostream &operator<<(ostream &out,const Quack &q)
{
    q.printOn(out);
    return out;
}

答案 1 :(得分:1)

通常,您应该让operator<<const Quack&,而不是Quack*

ostream& operator<<(ostream& out, const Quack &q)
{
   ...
}

将其放入Quack班级定义:

friend ostream &operator<<(ostream &stream, const Quack &q);

这将允许您的operator<<访问q的私人成员。