Как перегрузить оператор ostream‹‹ массивом?

У меня возникли проблемы с перегрузкой моего operator<< для печати содержимого массива неизвестного размера. Я искал решение, но единственное, которое я нашел, потребовало бы от меня поместить все мои личные элементы данных в структуру (что мне кажется немного ненужным). Я не могу отредактировать функцию, чтобы сделать ее другом или изменить *q на &q (или константу).

Вот мой код перегрузки ‹‹:

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

Любая помощь будет оценена. Спасибо!


person snazzy    schedule 29.10.2011    source источник
comment
Итак, вы пытаетесь печатать утиным шрифтом, а?   -  person Emile Cormier    schedule 29.10.2011
comment
Если operator << не может быть другом, зачем перечислять личные поля Quack? Какие общедоступные методы Quack позволяют получить доступ к отдельным элементам или Quack::items и к количеству элементов?   -  person outis    schedule 29.10.2011
comment
@snazzy: Если вы не можете изменить Quack, вам нужно указать это в своем вопросе.   -  person Emile Cormier    schedule 29.10.2011
comment
Спасибо. Я отредактировал свой пост, чтобы добавить функцию вызова. Я также вспомнил, что в публичном классе Quack есть функция itemCount.   -  person snazzy    schedule 29.10.2011
comment
В чем проблема? Ваша функция выглядит нормально, за исключением того, что (а) вы используете q как Quack, а не Quack*, и (б) функция не должна принимать Quack* в любом случае.   -  person Lightness Races in Orbit    schedule 29.10.2011
comment
Как распечатать элемент массива по указателю на массив?   -  person snazzy    schedule 29.10.2011


Ответы (2)


Другой альтернативой является перенаправление на функцию-член, например:

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;
}
person Vaughn Cato    schedule 29.10.2011

Как правило, вы должны сделать так, чтобы ваш operator<< принимал const Quack&, а не Quack*:

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

Поместите это в определение класса Quack:

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

Это позволит вашему operator<< получить доступ к закрытым членам q.

person rob mayoff    schedule 29.10.2011