2013-05-18 3 views
0

클래스가 Player이고 Creature *character 멤버 변수는 Elf : public Creature 파생 클래스를 가리 킵니다.다른 클래스의 개인 포인터가 가리키는 클래스에서 개인 정보를 얻으려면 어떻게해야합니까?

Player 개체를 선언 한 다음 해당 구성원 중 하나가 Elf을 가리키고 정보를 가져올 수 있기를 원합니다.

본인은 데이터 회원이 비공개이어야한다고 생각하지만 특별한 경우입니까, 아니면 Elf 회원의 정보를 main 기능에서 가져올 수 있습니까?

void Player::set_character(Creature &c) 
{ 
    character = &c; 
} 

... 
Player me; 
Elf me_elf; 
me.set_character(me_elf); 
+0

괜찮아 보입니다. 문제를 재현하는 최소한의 예를 게시 할 수 있습니까? – juanchopanza

+0

게시 한 코드가 올바른 것으로 보입니다. 다른 부분에 오류가있는 것 같습니다. 정확하게 런타임 오류는 무엇입니까? http://sscce.org/ –

+0

을 만들 수 있습니까? 지금 어떻게 든 작동 할 수 있습니다. 방금 내가 한 것을 알았 으면합니다. 미안 해요, 이제 포인터를 비공개로 할 때'Elf'에 액세스하는 방법을 알아야합니다. 비공개로 유지하려고한다고 가정합니다. – Leonardo

답변

2

당신은 Player의 공개 방법을 통해이 작업을 수행 할 수 있습니다

class Creature 
{ 
public: 
    virtual void hello() const = 0; 
}; 

class Player{ 
public: 
    void hello() const { charatcer->hello(); } 
    // other methods as before 
private: 
    Creature* character; 
}; 
+0

이 코드는 작동하지만,'= 0;'부분 만 지울 때만 유효하다. 그렇지 않으면, 그것은 가상 함수가 'Creature'내에서 순수하기 때문에 "추상적 유형 'Creature'객체를 할당 할 수 없다는 오류를 준다 : 그리고 마지막에'= 0; '이있는 함수로 간다. 이것은'Elf : Public Creature'와 같은 파생 클래스 내부의 생성자에서 발생합니다. 왜'= 0; '을 여기에 사용합니까? – Leonardo

+0

@Leonardo는'void hello()'를'Creature'의 순수 가상 메서드로 만듭니다. 나는'Creature'가 기본 클래스이고 모든 것이 파생 된 타입에서 구현 될 것이라고 가정하고있었습니다. 'Creature'를 인스턴스화하려면'= 0'을 제거하고 구현을 추가하십시오. – juanchopanza

1

을 당신이이 관계의 "있다"가 있다면, 당신은 데이터에 액세스하는 래퍼 함수를 ​​사용해야합니다.

"is a"관계가있는 경우 데이터가 "보호 된"경우 데이터에 액세스 할 수 있습니다. 다른 문제없이. 보호하면 파생 클래스가 데이터에 액세스 할 수 있습니다.

+0

사실 보호 받는다는 것이 확실하지만 사적인 목적을 저지합니다. – Leonardo

+0

@Leonardo는 여기에서 전혀 작동하지 않을 것입니다. – juanchopanza

+1

'보호 된'의 전체 지점은 관련성이있는 클래스는 허용하지만 연관되지 않은 클래스는 해당 멤버에 액세스 할 수 없다는 것입니다. 그것은 당신이 성취하고자하는 바에 달려 있습니다. '공공', '보호', '사적'의 구분은 여러 유형의 디자인이 서로 다른 수준의 접근을 필요로하는 바로 그 이유 때문입니다. [이것이 우리에게 더 완벽한 예와 올바른 공식화 된 질문을 필요로하는 이유입니다. 실제로 재활용되는 것은 재활용됩니다. 컴퓨터의 비트와 바이트는 재활용됩니다] –

관련 문제