2010-05-21 47 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

你只有宣佈構造和IArpPacketBuilder,不析構函數定義他們。鏈接器也需要定義。請注意,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 2010-05-21 09:29:39

+0

@豹,有趣。我認爲它不會那樣工作 - 如果你明確地聲明瞭一個構造函數/析構函數,編譯器將不會自動爲你生成它。請注意,C++沒有_abstract interface_的概念 - 你的類是一個普通的類,有一些純粹的虛擬方法,這使得它不可能直接實例化。 – 2010-05-21 09:34:31

+0

謝謝,我通過定義ctor和dtor的機構來工作,但我還是不明白爲什麼它在另一個庫中工作時,我沒有定義ctor和dtor。 – LeopardSkinPillBoxHat 2010-05-21 09:46:01

1

嘗試內聯他們 - 爲我的作品雖然不知道這是否是很好的解決方案

+0

您的意思是在IArpPacketBuilder中提供內聯實現? – LeopardSkinPillBoxHat 2010-05-21 09:24:59

+1

是的,彼得已經回答了非常相似的方式 – XAder 2010-05-21 09:36:07

2

您需要提供的定義 - 爲構造函數和析構函數都爲抽象接口類,即代碼機構 - 兩種功能會在你的代碼中使用,即使是一個抽象類。抽象類不是永遠不會被實例化的 - 它是永遠不會被用戶直接實例化的類。它將由編譯器實例化,編譯器需要定義構造函數和析構函數。