2010-05-05 59 views
1

在基於插件的C++項目中,我有一個用於在主應用程序和插件之間交換數據的TmpClass。因此,相應的TmpClass.h包含在主應用程序項目包含的抽象插件接口類中,並由每個插件實現。C++:不內聯時,構造函數/析構函數未解析嗎?

由於插件在TmpClass實例的STL向量上工作,因此需要爲TmpClass設置默認的構造函數和析構函數。我曾在TmpClass.h宣佈這些:

class TmpClass { 
    TmpClass(); 
    ~TmpClass(); 
} 

TmpClass.cpp實現它們。

TmpClass::~TmpClass() {} 
TmpClass::TmpClass() {} 

然而,編譯插件時,這會導致鏈接器抱怨大約兩個無法解析的外部 - 本所要求的std::vector<TmpClass>模板實例化默認的構造函數和TmpClass析構函數 - 即使所有其他功能我宣佈在TmpClass.h和實施TmpClass.cpp工作。只要我從.cpp文件中刪除(空的)默認構造函數和析構函數並將它們內聯到.h文件中的類聲明中,插件就可以編譯和工作。

爲什麼它默認的構造函數和析構函數內聯這個代碼來編譯?爲什麼它甚至是maatter? (我正在使用MSVC++ 8)。

+2

您是否將TmpClass.cpp包含到項目中? – SysAdmin 2010-05-05 05:19:45

+0

是 - 請參閱我的評論以回答1. – Anamon 2010-05-05 05:26:16

回答

2

您描述的行爲僅僅意味着您忘記將TmpClass.cpp文件包含到項目中。

編譯器不能也不會奇蹟般地知道定義了非內聯類方法的位置。您有責任編譯所有.cpp文件並將它們鏈接在一起。在MSVC中,通常通過將所有.cpp文件添加到項目中完成。

+1

感謝您的回覆,但.cpp文件已添加到項目中並進行編譯。正如我所說的,我在頭文件中聲明瞭其他函數,並在.cpp文件中實現了這些函數,這些函數可以工作,並且包含一個非默認的構造函數。它只是默認的構造函數和析構函數,當它們未被內聯時顯示爲未解析。 – Anamon 2010-05-05 05:25:51

+0

@Anamon - 您可能已將.cpp文件包含在主應用程序項目中。但那不足以編譯你的一個插件項目。你的插件項目永遠不知道Ctor和Dtor的定義在哪裏。 – SysAdmin 2010-05-05 05:34:35

+0

這完全令人尷尬。搞錯了,我確實把錯誤的文件拖到我的插件項目上,他們找不到.cpp文件。我不應該低估我忽視最明顯的事情的能力。謝謝你的幫助! – Anamon 2010-05-05 09:13:50

0

我猜你有一個「主應用程序」項目和一個或多個「插件」項目,看起來你沒有在插件項目中包含TmpClass.cpp。我也猜測「在.h中聲明並在.cpp中實現的所有其他函數」僅用於您的主項目,而不是您的插件。

正如其他人所說,你可以在你的插件項目中包含TmpClass.cpp。另一種選擇是創建一個dll「sdk」項目,並將主項目和插件項目連接起來。

如果你仍然認爲這和AndreyT的答案是錯誤的,你應該提供一些關於你的項目結構的更多信息。

相關問題