2012-02-04 7 views
3

다른 클래스 인 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 객체가 보유한 실제 데이터를 출력하도록하려면 어떻게이 코드를 다시 작성할 수 있습니까?

+0

아마도 문제는 getPlayingCards ... –

+0

std :: vector 또는 std :: set 과 같은 반복 가능한 컨테이너를 사용하는 것이 좋습니다. 최소한 콜렉션의 시작 반복자에 게터를 가져 와서 반복하면됩니다. 적어도 포인터에 대해 걱정할 필요조차 없습니다. (물론 이것은 포인터의 사용 가능성에 대해 특정 가정을합니다. ... PlaybackCard의 복사 생성자) ... 더 나은 방법은 방문자 디자인 패턴을 사용하여 PlayingCard 객체 컬렉션을 탐색하고 Deck 객체의 순회 논리를 유지하는 것입니다. – hatboyzero

답변

1

*pCards[i], (*pCards[i])*(pCards[i])은 모두 개체를 참조 해제합니다. Deck 구현에서 프로그램의 다른 부분에서 잘못된 부분이있을 수 있습니다. 당신은 PlayingCard에 대한 포인터 (= PlayingCard *를)입니다 pCards[i]를 전달하는

0
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; 
} 

. 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. 

당신이 방법은 위의 코드를 보여 함수에 볼 수 있는지 확인 있습니까?

+0

아주 좋은 질문입니다. 나는 잘 모르겠다. 나는 ostream & operator << (ostream & out, const PlayingCard & pc)를 PlayingCard 클래스의 friend 함수로 가지고 있습니다. PlayingCard는 Deck의 헤더 파일에서 앞으로 선언되고 마지막으로 두 클래스의 헤더가 Deck의 소스 파일에 포함됩니다. –