2010-05-21 4 views
1

밤늦게까지 여기있어 링커 오류를 해결하려고 미쳤습니다.상속 인터페이스를 상속 할 때 확인되지 않은 기호

나는 다음과 같은 추상적 인 인터페이스가있는 경우 :

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId); 
    virtual ~IArpPacketBuilder(); 

    // Other abstract (pure virtual methods) here... 
}; 

을 내가 같이 인스턴스화 : 링크 할 때

class DummyArpPacketBuilder 
    : public IArpPacketBuilder 
{ 

public: 

    DummyArpPacketBuilder(const DslPortId& aPortId) 
     : IArpPacketBuilder(aPortId) {} 
    ~DummyArpPacketBuilder() {} 
}; 

왜 나는 다음과 같은 오류는 무엇입니까?

Unresolved symbol references: 

IArpPacketBuilder::IArpPacketBuilder(DslPortId const&): 
    ppc603_vxworks/_arpPacketQueue.o 
IArpPacketBuilder::~IArpPacketBuilder(): 
    ppc603_vxworks/_arpPacketQueue.o 
typeinfo for IArpPacketBuilder: 
    ppc603_vxworks/_arpPacketQueue.o 
*** Error code 1 

IArpPacketBuilder는 (파생) 인터페이스는, 내가 아니, 괜찮을 너무 오래 내가 콘크리트의 생성자와 멸망을 정의로, 추상 인터페이스입니다? 글쎄요.

답변

5

있는지 모르겠지만. 링커도 정의가 필요합니다. C++에는 의 개념이 없습니다. 추상 인터페이스 - IArpPacketBuilder은 순수 가상 메서드가 포함되어있는 일반 오래된 클래스이므로 직접 인스턴스화 할 수 없습니다.

그래서 가장 간단한 해결책은 인라인 구현을 제공하는 것입니다 :

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId) {} 
    virtual ~IArpPacketBuilder() {} 

    // Other abstract (pure virtual methods) here... 
}; 

또한 가상 소멸자 순수 할 수 있지만, 그렇다고하더라도, 당신은 여전히 필요가 정의를 제공을하기에, 예를 들어, 클래스가 추상적 인 경우에도 두 기능은 코드에서 사용됩니다 - 추상 인터페이스 클래스의 생성자와 소멸자 모두 즉 코드 기관 -

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId) {} 
    virtual ~IArpPacketBuilder() = 0; 

    // Other abstract (pure virtual methods) here... 
}; 

IArpPacketBuilder::~IArpPacketBuilder() {} 
+0

다른 라이브러리의이 인터페이스에서 아무 문제없이 상속 할 수 있었으므로 문제가 될 것이라고 생각하지 않았습니다. 추상적 인 인터페이스에서 그것들을 정의해야합니까? – LeopardSkinPillBoxHat

+0

@Leopard, 흥미 롭습니다. 그 방법으로는 작동하지 않을 것이라고 생각했습니다. 명시 적으로 생성자/소멸자를 선언하면 컴파일러에서 자동으로 생성자/생성자를 생성하지 않습니다. C++에는 _abstract interface_에 대한 개념이 없습니다. 클래스는 순수 가상 메서드가있는 일반 클래스이므로 직접 인스턴스화 할 수 없습니다. –

+0

감사합니다. ctor 및 dtor의 본문을 정의하여 작동 시켰지만 ctor 및 dtor를 정의하지 않은 경우에도 왜 다른 라이브러리에서 작동하는지 이해할 수 없습니다. – LeopardSkinPillBoxHat

1

그들을 인라인 시도 - 나를 위해 작동 만 선언 생성자 및을 정의 IArpPacketBuilder하지 의 소멸자를 가지고는 좋은 해결책

+0

IArpPacketBuilder에서 인라인 구현을 제공한다는 의미입니까? – LeopardSkinPillBoxHat

+1

예, Peter가 대답 한 것과 같은 방식입니다. – XAder

2

당신은 정의를 제공해야합니다. 추상 클래스는 결코 인스턴스화되지 않는 클래스가 아니라 사용자가 직접 인스턴스화하지 않는 클래스입니다. 그러나 이것은 생성자와 소멸자를 정의해야하는 컴파일러에 의해 인스턴스화됩니다.

관련 문제