精華區beta Programming 關於我們 聯絡資訊
: someException(){} : ~someException(){} : }; : class AbstractBase : { : public: : virtual ~AbstractBase () : throw (); 這裡好像沒有定義 剛沒看仔細 以為你後面有寫它的定義 : virtual void someFunction () : throw (someException) = 0; : }; : #endif //_SPEC_H : 我手中有Spec.h的檔案裡面 定了 抽象類別 AbstractBase這個class : 因為是要依照標準所制定的API去實現的,不過它有virtual destructor, : 所以小弟不知道怎麼怎樣在其它檔案去宣告,才能去實作它。 : 因為我一直發生在連結錯誤的情形。 : 因為我必須還要再另外寫兩個檔案 ImplementSpec.h跟 ImplementSpec.cpp : 如下所示… : //file : ImplementSpec.h : #ifndef _IMP_SPEC_H : #define _IMP_SPEC_H : #include "Spec.h" : class ConcreteDerived : public AbstractBase{ : public: : ConcreteDerived(); : virtual ~ConcreteDerived() : throw (); : virtual void someFunction() : throw (someException); : }; : #endif //_IMP_SPEC_H : //file : ImplementSpec.cpp : #include "ImplementSpec.h" : ConcreteDerived::ConcreteDerived() : { : //do nothing : } : ConcreteDerived::~ConcreteDerived() throw () : { : //do nothing : } : void ConcreteDerived::someFunction() throw (someException) : { : //do nothing : } : 然後我的主程式寫了簡單如下所示的東東。 : //file : test.cpp : #include "Spec.h" : #include "ImplementSpec.h" : class ConcreteDerived; : int main(){ : AbstractBase *someobj = new ConcreteDerived(); : delete someobj; : return 0; : } : 小弟是在Linux環境下作開發的,然後g++ 版本是 : g++ (GCC) 3.3.5 (Debian 1:3.3.5-13) : 接著我就對 test.cpp, ImplementSpec.cpp編成 .o檔,最後再連結生成a.out可執行檔 : 下面是我紀錄著我在shell環境下執行的指令,然後下面會發生 : 有關聯結上的錯誤。 : usrooo@xxxcluxxxx:~/VirtualDestructor$ g++ -c test.cpp : usrooo@xxxcluxxxx:~/VirtualDestructor$ g++ -c ImplementSpec.cpp : usrooo@xxxcluxxxx:~/VirtualDestructor$ g++ -o a.out test.o : ImplementSpec.o : ImplementSpec.o(.text+0x4e): In function `ConcreteDerived::~ConcreteDerived : [not-in-charge]()': : : undefined reference to `AbstractBase::~AbstractBase [not-in-charge]()' : ImplementSpec.o(.text+0x82): In function `ConcreteDerived::~ConcreteDerived : [in-charge]()': : : undefined reference to `AbstractBase::~AbstractBase [not-in-charge]()' : ImplementSpec.o(.text+0xb6): In function `ConcreteDerived::~ConcreteDerived : [in-charge deleting]()': : : undefined reference to `AbstractBase::~AbstractBase [not-in-charge]()' : ImplementSpec.o(.gnu.linkonce.t._ZN12AbstractBaseC2Ev+0x8): In function : `AbstractBase::AbstractBase[not-in-charge]()': : : undefined reference to `vtable for AbstractBase' : ImplementSpec.o(.gnu.linkonce.r._ZTI15ConcreteDerived+0x8): undefined : reference to `typeinfo for AbstractBase' : collect2: ld returned 1 exit status : 因為不知道解決的情況下,只好來這邊請教了。 : 還望各位大大們的幫助了 : 謝謝^__________^y -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.172.218.185