2011-01-13 2 views
8

문제 클래스가 *.h*.cpp files으로 나뉘어 질 때 일부 추상 클래스에서 상속 된 순수 가상 함수를 구현하는 데 문제가 있습니다. 컴파일러 (g++)는 순수 함수가 있기 때문에 파생 클래스를 인스턴스화 할 수 없다고 알려줍니다. 인터페이스의 *.h과 너무 derived.h에 - C++의 순수 가상 함수 구현 및 헤더 파일

/** interface.h**/ 
namespace ns 
{ 
    class Interface { 
     public: 
      virtual void method()=0; 
    } 
} 

/** interface.cpp**/ 
namespace ns 
{ 
    //Interface::method()() //not implemented here 
} 

/** derived.h **/ 
namespace ns 
{ 
    class Derived : public Interface { 
     //note - see below 
    } 
} 

/** derived.cpp **/ 
namespace ns 
{ 
    void Derived::Interface::method() { /*doSomething*/ } 
} 

/** main.cpp **/ 
using namespace ns; 
int main() 
{ 
    Interface* instance = new Derived; //compiler error 
} 

이 나는 ​​회) ( 방법을 선언 해야한다는 뜻인가요? 주위에 다른 방법이 없습니까?

+0

이것은 C++가 아닙니다. 'public void method() = 0;'자바와 비슷하게 보입니다. –

+0

첫 번째로 .cpp 파일을 가질 이유가 없으며 유일한 네임 스페이스는 공백 네임 스페이스입니다. 추상 클래스를 처리하는 헤더에 대한 구현 파일은 필요하지 않습니다. – Falmarri

+0

@Falmarri가 정확합니다. –

답변

12

Derived::method()을 신고하는 것을 잊었습니다.

최소한 정의하려고 시도했지만 Derived::method()이 아닌 을 작성했지만 사용자가 선언하지 않았습니다. 그러므로 그것은 존재하지 않습니다.

따라서, Derived 따라서 순수 가상 함수 method()Interface에서 오버라이드 (override)되지 않은 ... 따라서, Derived 또한 가상 순수하고 인스턴스화 할 수없는, 어떤 method()이 없습니다.

또한 public void method()=0;은 유효하지 않습니다. C++; 자바와 비슷해 보입니다. 순수 가상 멤버 함수는 실제로 가상이어야하지만 virtual을 쓰지 않았습니다. 액세스 지정자는 콜론 다음에옵니다.

public: 
    virtual void method() = 0; 
+0

무효 비트는 아마 오자인데, 자바도 아닙니다. – time4tea

+0

@ time4tea : 실제로 그것은 유효한 Java도 아니지만 콜론이 누락되어 있고 액세스 지정자가 선언에 결합 된 것으로 간주되었다는 암시와 함께 C++보다 더 가까이에서 볼 수 있습니다! –

+0

구문은 내 오타였습니다. 시작 게시물에 대한 내 의견을 참조하십시오. :) 죄송합니다. 또한,'Derived :: Interface :: method()'는 Interface에서 상속되어야하는 함수를 정의하려는 시도입니다. 원래의 질문은 "파생 클래스의'.h' 파일에서 명시 적으로 선언하지 않고 상속 된 순수 가상 함수를 구현 (정의) 할 수 있습니까? 그 이유는 클래스가 여러 인터페이스를 상속 할 때 헤더 파일이 어수선하게 흩어지는 것을 피하기 위해서입니다. 각각의 순수 가상을 포함하고 있습니다. – Neo

11

하위 클래스에서 메소드를 선언해야합니다.

// interface.hpp 
class Interface { 
public: 
    virtual void method()=0; 
} 

// derived.hpp 
class Derived : public Interface { 
public: 
    void method(); 
} 

// derived.cpp 
void 
Derived::method() 
{ 
    // do something 
} 
+0

나는 ** 선언 ** (정의하지 않음)을 의미한다고 생각합니다. –

+0

@MikeSlutsky 예 했어요. – robert

+0

@robert 답변 해 주셔서 감사합니다. 그 이유를 알 수 있습니까? 자바에서 오는 것은 매우 더러운 것처럼 보입니다. 기본 인터페이스에서 많은 다른 클래스와 메소드를 파생 시켰을 때 기본 인터페이스가 변경된 경우 많은 파일을 변경해야합니다. –