2011-02-02 1 views
2
class Base 
{ 
private: 
    static int num; 
public: 
    friend void setnum(Base obj); 
}; 

void setnum(Base obj) 
{ 
    obj.num=4; /* Error */ 
} 

친구 함수는 클래스의 모든 개인 데이터에 액세스해야합니다. 나는 무엇을 여기에서 놓치고 있냐? 나는 친구 기능에서 정적 변수에 액세스하는 것 같지 않습니다. codepad에서친구 함수에서 정적 변수 액세스

오류 -> 기능 setnum(Base)': undefined reference to 자료 : NUM '비주얼 스튜디오에서

오류에서 -> 오류 LNK2001 : 되지 않은 외부 기호 "개인 : 정적 INT 자료 : NUM"

+0

클래스가 cpp 파일에 있습니다. 그것은 단지 기본적인 코드 비트였습니다. –

답변

2

당신은 단지 정적 변수 num을 선언했다. 정의해야합니다 :

class Base 
{ 
private: 
    static int num; 
public: 
    friend void setvals(Base obj); 
}; 

// This must be in a .cpp 
int Base::num; 

void setvals(Base obj) 
{ 
    obj.num=4; 
} 

이 코드는 작동합니다.

편집 : 다음과 같이

은 실제로 당신이 setvals() 기능을 구현할 수 있습니다

void setvals() 
{ 
    Base::num=4; 
} 

그리고 당신의 기본 클래스에서

:

friend void setvals(); 

때문에 num 정적이다.

+0

이 더 유익한 것으로 나타났습니다. –

0

정적 변수는 클래스의 특정 인스턴스에 속하지 않습니다. 대신 가독성을 높이기 위해 클래스 이름을 Base::num으로 처리 할 수 ​​있으며 친구 함수 정의에는 신고 한 서명과 다른 서명이 있습니다. 당신이 실제로 단지를 선언하지, 정적 변수를 정의해야합니다 게다가

...

+0

당신은 obj.num으로 그것들에 접근 할 수 있습니다. –

+0

당신은 액세스 할 수 있지만 프로그래머/독자가 특정 인스턴스에 속한다는 인상을줍니다. 따라서 가독성을 높이려면 클래스 이름으로 액세스해야합니다. – Mahesh

+0

그런 식으로 읽을 수는 있지만 (나는 항상 그렇게 생각하지 않습니다), 여전히 "클래스 이름으로 액세스해야합니다"라는 것은 잘못입니다. –

4

귀하의 무료 기능을 setvals라고하지만, Base의 친구 기능은 setnum이라고합니다.

넣어 : 소스 파일에서

int Base::num; 

.

+0

5 분 이내에 편집하는 것은 바람 피운 것입니다. :)하지만 이제는 두 가지 오류가 발생하므로 삭제하겠습니다. –

+0

@Fred Nurk : 아니요. 아마 먼저 거기에있어. 나는 당신의 대답을 편집하지 않았습니다. – peoro

+0

나는 당신이 나의 것과 다른 대답을 복사 할 것을 암시하는 것을 의미하지는 않았다. 그리고 나는 자주 5 분 안에 편집합니다. :) '측은, 나는 그것에서 징계 배지를 얻었다. –

0

다른 친구 :

friend void setnum(Base obj); 
     // ^^^ Not the same as vals! 
     void setvals(Base obj) 
+0

여기에 코드를 붙여 넣을 때 타이핑 오류가 발생하여 함수 이름을 변경하려고했습니다. 첫 번째 훑어보기에서 –

0

C++에서는 .h에 정적 변수를 선언하는 것으로 충분하지 않습니다. .cpp에서도 명시 적으로 정의해야합니다. 구현의 .cpp를 추가해야합니다.

int Base::num; 

이 변수 정의가 없어서 링커 오류가 발생했습니다.