2012-01-19 6 views
2

내 첫 게시물은 여기에 :)Friend 함수는 파생 클래스의 정적 멤버를 호출합니다. 예상 출력을 얻지 못했습니다

다음 C++ 코드에 문제가 있습니다. 내가 ABC 클래스 A를 가지고 있고, 두 개의 파생 클래스 B와 C는 그들 모두 정적 멤버는 ID라는이 :

using std::cout; 

class A 
{ 
private: 
    friend int bar(A& a); 
    static const int id = 1; 

    virtual void foo() = 0; 
}; 

class B : public A 
{ 
private : 
    friend int bar(A& a); 
    static const int id = 2; 

    void foo() { /*Do something*/ } 
}; 

class C : public A 
{ 
private: 
    friend int bar(A& a); 
    static const int id = 3; 

    void foo() { /*Do something*/ } 
}; 

int bar(A& a) 
{ 
    return a.id; 
} 

int main() 
{ 
    B b; 
    C c; 

    cout << bar(b) << "\n"; 
    cout << bar(c) << "\n"; 

    return 0; 
} 

내가 2와 3를 인쇄이 코드를 기다리고 있었다 - 오히려 1 밖으로 인쇄하고 1 (bar()는 항상 A :: id를 사용합니다). 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떤 아이디어?


아래의 설명에 따르면, 사용중인 최종 코드입니다. 그것은 작동하지만,

#include <iostream> 

using std::cout; 

class A 
{ 
private: 
    virtual void foo() = 0; 
}; 

class B : public A 
{ 
private: 
    template <typename T> 
    friend int bar(T& t); 

    static const int id = 2; 
    void foo() { /*do something*/ } 
}; 

class C : public A 
{ 
private: 
    template <typename T> 
    friend int bar(T& t); 

    static const int id = 3; 
    void foo() { /*do something*/ } 
}; 


template <typename T> 
int bar(T& t) 
{ 
    return t.id; 
} 


int main() 
{ 
    B b; 
    C c; 

    cout << bar(b) << "\n"; 
    cout << bar(c) << "\n"; 

    return 0; 
} 
+0

'bar'는 친구로 선언하지만이 코드에는 의미가 없습니다. –

+0

@Jesse 내 실제 코드 ID는 private입니다. 출력에 아무런 차이가 없습니다. 위의 게시물을 변경했습니다 :) – ahmadh

+0

오른쪽, 친구 함수는 대답의 제안과 같이 A, B 및 C의 멤버로 멤버를 만들어야 원하는 것을 달성하기 위해 클래스의 비공개 및 보호 된 멤버에 액세스 할 수있는 권한을 부여합니다. –

답변

1

모든 파생 클래스에 대해 int foo() { return id; }을 쓰는 것을 피할 수있는 방법이 있습니까?

예, 템플릿을 사용합니다. 예를 들어 : id가 개인 인 경우

template <typename T> 
int foo (T& x) 
{ 
    return x.id; 
} 

그러나이 훨씬 모든하여 코드를 감소하지 않습니다.

+0

감사합니다. 원래 게시물을 수정했습니다. – ahmadh

+0

@ahmadh : 친구 함수를 선언하는 대신 id를 반환하고 함수 템플리트에서 해당 멤버를 호출하는 멤버를 선언해야합니다 (예 :'return t.getid()'). –

2

a.idA::id로 컴파일 시간에 정의됩니다 :) 더 많은 의견을 듣고 싶어요. A 클래스의 가상 멤버 (비 정적) 함수를 정의하고 BC으로 재정의하여 각각 id을 반환하고 bar에이 함수를 호출해야합니다.

+0

원하는 용어는 _overloading_가 아니고 _overriding_가 아니라는 점에 유의하십시오. 전자는 컴파일시 다른 서명이 선택된 함수를 참조하고, 후자는 동일한 서명을 가진 다른 함수를 참조합니다 (또는 C++ 이외의 다른 언어에서는 contra- 변종 인수)가 포함되어 있습니다. –

+0

@Dmitry 귀하의 의견을 읽은 후 원래 게시물을 편집했습니다. – ahmadh

관련 문제