다른 클래스 인 PlayingCard에 대한 포인터를 동적으로 할당 한 배열을 포함하는 Deck 클래스의 객체가 있습니다. deck 객체에있는 각 카드의 세부 정보를 반복적으로 출력하기 위해 < < 연산자 (Deck 클래스의 친구)를 오버로드하려고합니다.배열의 요소 인 dereferencing 포인터?
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;
}
갑판 오브젝트 출력의 카드 정보를 구성하는 시도가 메모리 주소가 아닌 실제 데이터의리스트를 출력하므로 I는 I가 비 참조 pCards [필요 같다 : 현재 과부하 정의는 다음과 같다 나는]. 그러나이를 시도 할 때 출력이 가비지이며 결국 디버거에서 액세스 위반이 발생합니다. 나는 다음과 같은 콤보의 모든 시도했지만, 모두 컴파일 타임 또는 런타임 중 하나를 문제의 원인 :
*pCards[i], pCards[i]*, (*pCards[i]), *(pCards[i])
배열 내에서의 포인터를 역 참조이 단지 잘못된 구문, 아니면 뭔가 더 깊은 내가 거기입니다 여기서 이해 못 하겠니? 프로그램이 메모리 주소가 아닌이 PlayingCard 객체가 보유한 실제 데이터를 출력하도록하려면 어떻게이 코드를 다시 작성할 수 있습니까?
아마도 문제는 getPlayingCards ... –
std :: vector 또는 std :: set 과 같은 반복 가능한 컨테이너를 사용하는 것이 좋습니다. 최소한 콜렉션의 시작 반복자에 게터를 가져 와서 반복하면됩니다. 적어도 포인터에 대해 걱정할 필요조차 없습니다. (물론 이것은 포인터의 사용 가능성에 대해 특정 가정을합니다. ... PlaybackCard의 복사 생성자) ... 더 나은 방법은 방문자 디자인 패턴을 사용하여 PlayingCard 객체 컬렉션을 탐색하고 Deck 객체의 순회 논리를 유지하는 것입니다. –
hatboyzero