2016-05-31 1 views
0

나는 클래스를친구 기능과 보호 된 데이터는

class ScoreBoard: public die 
{ //..// 
    protected: 
    bool mSetValue[6]; 
    public: 
//...// 
     friend void ValueSet(); 
}; 

을하고 난 mSetValue에 대한 액세스를 얻을 우정을 사용하고 싶습니다. 나는 이런 식으로 정의 다음 funcion (void ValueSet();)과 predifine : 그래서 제가 ScoreBoard.cpp에서 할 것은

void ValueSet() 
{ char lPick; 
std::cin >> lPick; 
if (lPick == 1) mSetValue[0] = true; } 

을하지만 디버거는 말한다 :

'mSetValue이'이 범위에서 선언되지 않았습니다 .

그래서 내 질문은 - 우정을 올바르게 설정하는 방법 ValueSetmSetValue 어레이에 액세스 할 수 있습니까?

+4

friend void ValueSet(ScoreBoard &sb); 

그리고 당신의 정의로 ValueSet() 기능을 선언하여 수행 할 수 있습니다. – StoryTeller

+1

관련없는 참고 사항 : 어떤 점에서 주사위와 비슷한 점수 판입니까? – molbdnilo

+0

왜 비슷한가? 클래스에 대한 스코어 보드 상속은 public 메서드에 액세스 할 수 있습니다. –

답변

1

인스턴스 변수 (개체) 내에 이 있습니다. 인스턴스 변수라고도합니다. 클래스의 인스턴스가 없으면 인스턴스 변수가 없습니다.

mSetValueScoreBoard의 멤버 변수입니다. 따라서 ScoreBoard::mSetValue 인스턴스는 ScoreBoard 인스턴스 내에 만 존재합니다.

ValueSet이 mSetValue 배열에 액세스 할 수 있도록 우정을 올바르게 설정하는 방법은 무엇입니까?

void ValueSet()에는 ScoreBoard의 인스턴스가 없습니다. 액세스 지정자 또는 우정에 관계없이 ScoreBoard::mSetValue에 액세스 할 수 없습니다. 존재하지 않기 때문입니다. 필요한 것은 ScoreBoard의 인스턴스입니다.

나는 내가 그 안에

아무것도 ScoreBoard의 멤버 함수 내에서 ScoreBoard의 인스턴스를 생성하지 못하도록를 스코어 보드의 인스턴스를 만들 수 없습니다 스코어 보드 클래스 내에서이 기능을 사용합니다. ScoreBoard의 멤버 함수 내에서 이미 this이 가리키는 인스턴스에 액세스 할 수 있으므로 새 인스턴스를 만들 필요가 없습니다. 당신이해야 할 일은 당신의 의도에 달려 있습니다.

귀하의 의견을 감안할 때, 나는 회원 함수가 자유 함수가 아닌 귀하에게 더 적합하다고 생각합니다.

간단히하기 위해 비 정적 구성원 변수를 나타 내기 위해 "구성원 변수"라는 일반 용어를 사용합니다. 정적 멤버 변수는 다릅니다. 클래스 변수라고도합니다.

+0

좋아,하지만 ScoreBoard 클래스 안에이 함수를 사용하므로 ScoreBoard 인스턴스를 만들 수 없습니다. 정적 변수 (왜냐하면 그들은 "불멸"이기 때문에)이지만,이 아이디어는 작동하지 않습니다. 함수 내부에서 수행 할 수있는 방법이 있습니까? 아니면 기본에서 ValueSet 함수를 사용해야합니까? –

+0

@ PawełMotyka는 수정 된 답변을 참조하십시오. 나는 멤버 함수가 자유 함수가 아닌 당신에게 더 적합 할 것으로 생각한다. – user2079303

1

친구 기능은 클래스의 멤버가 아닙니다. 따라서 mSetValueValueSet에 사용하려면 해당 클래스의 인스턴스 또는 "개체"를 통해 mSetValue에 대한 액세스 권한을 제공해야합니다.이것은 당신은 그것의 멤버에 액세스하기 위해 * 객체 * 필요

void ValueSet(ScoreBoard &sb) 
{ 
    char lPick; 
    std::cin >> lPick; 
    if (lPick == 1) 
     sb.mSetValue[0] = true; 
}