2009-09-04 4 views
1

현재 구현 된 추상 인터페이스가있는 C++ 프로젝트에서 현재 작업하고 있습니다. 인터페이스에는 구현 된 메서드가 있으며이 메서드는 재정의하지 않습니다. 내 구현을 사용할 때 컴파일러 (MSVC) 인터페이스 메서드를 볼 수 없습니다. 이 문제의 원인은 무엇이며 어떻게 해결할 수 있습니까?구현에 가상 메서드가 표시되지 않습니다.

여기에 코드가옵니다.

#include <string> 
#include <vector> 
using std::string; 

class A 
{ 
    public: 
    string name; 
}; 

class interface 
{ 
public: 
    virtual int num_foo() = 0; 
    virtual A* foo(int) = 0; 
    virtual A* foo(string &name){ 
     for (int i(0); i < num_foo(); i++) 
      if (foo(i)->name == name) 
       return foo(i); 
     return 0; 
    } 
}; 

class implementation : public interface 
{ 
public: 
    virtual int num_foo() { return m_foos.size(); } 
    virtual A* foo(int i) { 
     //check range 
     return &m_foos[i]; 
    } 
    std::vector<A> m_foos; 
}; 

int main(...) 
{ 
    implementation impl; 
    // impl is properly initialized here 

    string name("bar"); 
    // here comes my problem, the MSVC compiler doesn't see foo(string &name) 
    // and gives an error 
    A *a = impl.foo(name); 
} 
+2

내가 그것을 좀보고 내 편집기에 코드를 붙여 넣은,하지만 난 반 고정 후 나는 그것을 포기 12 개의 오류가 있지만 아직 컴파일되지 않았습니다. 당신이 요구하는 단 하나의 문제 만 가진 코드를 제공하는 것이 그렇게 어렵지 않습니까? 그것이 그렇듯이 나는 당신이 불평하는 수십 가지 오류 중 어느 것을 볼 수 없습니다. 코드를 수정하십시오. – sbi

+1

나쁜 코드를 유감스럽게 생각합니다. 나는 이제 오류를 바로 잡았고 이제는 내 문제가있다. –

답변

5

과부하 해결 전에 이름 확인이 발생합니다. impl.foo(name)에서 컴파일러는 implementation 클래스를보고 virtual A& foo(int i) 만 찾습니다. 올바른 이름의 함수를 찾았 기 때문에 기본 클래스를 보지 않습니다.

이 사용은 오버로드 확인의 목적으로 파생 클래스에 foo의 기본 버전을 모두 끌어 파생 클래스에 using interface::foo 선언을 추가 할 수 있습니다 해결하려면. 일반적으로 오버로드 된 함수를 피하기를 원하며 foo의 함수 이름에 다른 함수 이름을 지정해야합니다.

,

(당신이 참조에 -> 대신 .를 사용하려고 시도하고 당신은 A에 대한 참조를 반환하는 함수에서 0을 반환하려고 다른 오류는 string, vector 또는 m_ones 정의하지 않는 것이 있습니다.)

+0

+1 명확한 설명뿐만 아니라 두 가지 제안 된 해결 방법! – RichieHindle

+0

제 질문에 답변 해 주신 데 대해 감사드립니다. –

3

는 과부하에 대한 서브 클래스 (예 foo는 (문자열)) 기재 방법을 재 게시 클래스 구현에

using interface::foo; 

을 추가한다. 당신이 foo 멤버가 않습니다 implementation 인터페이스를 접근하고 있기 때문에 찰스 베일리 @ 이미 대답에 언급 한 바와 같이

+0

빠르고 좋은 답변 주셔서 감사합니다! –

1
class implementation : public interface{ 
    public: 
     using interface::foo; 
     int num_foo() { return m_foos.size(); } 
     A& foo(int i) 
     { //check range 
      return m_ones[i]; 
     } 
     vector<A> m_foos; 
     vector<A> m_ones; 
}; 
0

이 단지 문제입니다. 당신은 아마 실제로 전화를해야하므로

의미 적, 당신이 전화를하려는 것은 interface 방법 푸입니다 : 이것은 또한 개인 implementation::foo을함으로써 Non-Virtual Interface idiom을 구현할 수 있도록 할

int main() 
{ 
    implementation impl; 
    string name("bar"); 
    interface& interf = impl; 
    A *a = interf.foo(name); 
    A *b = interf.foo(4); 
} 

. impl.foo을 직접 호출하려고해도 오류는 계속 발생하지만 동일한 오류로 모든 인수 유형에 대해 실패합니다.

(나는이 질문은 오래 알고 있지만, NVI는 나이가 ...)

관련 문제