C ++ - разыменование указателей, которые являются элементами массива? - PullRequest
3 голосов
/ 05 февраля 2012

У меня есть объект класса Deck, который содержит динамически распределенный массив указателей на объекты другого класса, PlayingCard. Я пытаюсь перегрузить оператор << (как друг класса Deck) для итеративного вывода деталей каждой карты в объекте Deck. В настоящее время определение перегрузки выглядит так: </p>

ostream& operator<< (ostream& out, const Deck& d)
{
    PlayingCard** pCards = d.getPlayingCards();
    for(int i = 0; i < d.getTotalCards(); ++i)
    {
        out << pCards[i] << endl;
        // the << operator is also overloaded in the PlayingCard class to take PlayingCard objects as arguments.
        // the overload in the PlayingCard class definitely works.
    }

    return out;
}

При попытке создать объект Deck и вывести информацию о его карточке, он выводит список адресов памяти, а не фактические данные, поэтому я думаю, мне нужно разыменовать pCards [i]. Однако, когда я пытаюсь это сделать, вывод становится мусором, и я в конечном итоге получаю нарушение прав доступа в отладчике. Я перепробовал все следующие комбинации, но все они вызывают проблемы во время компиляции или во время выполнения:

*pCards[i], pCards[i]*, (*pCards[i]), *(pCards[i])

Это просто неправильный синтаксис для разыменования указателя, который находится внутри массива, или есть что-то более глубокое, чего я здесь не понимаю? Как я могу переписать этот код, чтобы программа выводила фактические данные, хранящиеся в этих объектах PlayingCard, а не только адреса памяти?

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

*pCards[i], (*pCards[i]) и *(pCards[i]) - все разыменовывают объекты. В другой части вашей программы что-то не так, вероятно, в реализации Deck.

0 голосов
/ 05 февраля 2012
ostream& operator<< (ostream& out, const Deck& d)
{
    PlayingCard** pCards = d.getPlayingCards();
    for(int i = 0; i < d.getTotalCards(); ++i)
        out << (*(pCards[i])) << endl;  
    return out;
}

Вы передаете pCards[i], который является указателем на PlayingCard (= PlayingCard *). Для этого не будет перегружен метод operator<<, поэтому вам нужно *(pCards[i]), но тогда вы также должны убедиться, что у вас есть соответствующая перегрузка для класса PlayingCard. т.е. функция друга с подписью:

ostream& operator<< (ostream& out, const PlayingCard& d);

Упс, просто прочитайте ваши комментарии:

        // the << operator is also overloaded in the PlayingCard class to take PlayingCard objects as arguments.
        // the overload in the PlayingCard class definitely works.

Вы уверены, что метод виден функции, код которой вы указали выше?

...