2012-02-05 51 views
1

需要通過繼承實施純抽象類,使用命名空間來包裝我的所有類,以避免與他人發生衝突的幫助。錯誤消息:純抽象類包裹在一個命名空間在C++

我已經能夠建立併成功運行的代碼,如果我從我的抽象類,並從我的純抽象類繼承所有課程中移除命名空間的包裝。

這似乎是Visual Studio 2010的編譯器抱怨說,儘管所有的類都在同一個命名空間,抽象類的純抽象方法未實現。

任何幫助將不勝感激。

//IBaseClass.h 

//forward declaration 
class ConcreteClass; 

//namespace MyCustomNamespace 
//{ 
    class IBaseClass 
    { 
    public: 
     virtual ~IBaseClass() { /*virtual destructor*/ } 
    //Behaviours... 
     virtual bool Method001(const ConcreteClass &cc) = 0; 
     //virtual bool Method002(/*some input*/) = 0; 
    }; 
//} /*NAMESPACE*/ 

//----------------------------------------- 
//ParentClass.h 

//namespace MyCustomNamespace 
    //{ 
    class ParentClass : virtual public IBaseClass 
    { 
    private: 
     int a; 

    public: 
     virtual ~ParentClass() { /*virtual destructor*/ } 

     //getter-setter implemented in ParentClass.cpp file... 
     void setA(const int aa); 
     const int getA() const; 
    }; 
//} /*NAMESPACE*/ 


//----------------------------------------- 
//ConcreteClass.h 

//namespace MyCustomNamespace 
//{ 
    class ConcreteClass: public ParentClass 
    { 
    private: 
     int b; 

    public: 
     virtual ~ConcreteClass() { /*virtual destructor*/ } 

     //getter-setter... 
     void setB(const int bb);    
     const int getB() const; 

     bool Method001(const ConcreteClass &cc); //re-declaring IBase abstract method... 
    }; 
//} /*NAMESPACE*/ 


//----------------------------------------- 
//ConcreteClass.cpp 


//namespace MyCustomNamespace 
//{ 
    void ConcreteClass::setB(const int bb) { this->b = bb; } 
    const int ConcreteClass::getB() const { return this->b; } 

    bool ConcreteClass::Method001(const ConcreteClass &cc) 
    { 
     //implementation code goes here... 
     return false; 
    } 
//} /*NAMESPACE*/ 
+0

這實際工作正常,我。你能發佈錯誤嗎? – 2012-02-05 09:59:29

+0

我在這裏發佈的代碼有效,如果您在每個類的.h和.ccp文件中取消註釋命名空間部分,那麼它會拋出錯誤mgs,我的ConcreteClass是一種抽象方法。這似乎是編譯器無法弄清楚,我已經實現了純粹的抽象方法在我的具體類,除非我從使用IBASE類 – badboy11 2012-02-05 10:06:21

+3

隨着命名空間沒有註釋的所有類中刪除的命名空間,它[仍然有效(HTTP:/ /ideone.com/cpv7x)。你能發佈導致錯誤的確切代碼(和確切的錯誤信息)嗎? – 2012-02-05 10:21:09

回答

0

問題是您的轉發類已在另一個名稱空間(特別是全局名稱空間)中聲明。因此,要覆蓋的虛擬是具有不同參數類型的不同符號。

書面,編譯器相匹配ConcreteClass的向前聲明的基礎聲明時,看到在全局命名空間:

virtual bool Method001(const ConcreteClass &cc) = 0; 

當你聲明Method001ConcreteClass

virtual bool Method001(const ConcreteClass &cc); 

編譯匹配ccMyCustomNamespace::ConcreteClass,因爲這是更準確的匹配。

要解決此問題,只需將您的向前聲明在正確的命名空間:

namespace MyCustomNamespace { 
    class ConcreteClass; 
} 
+0

非常感謝您,只需將名稱空間內的前向聲明即可。今天拿起了一些新的東西,我認爲所有的#包括和聲明都假設在命名空間之外聲明......生活和學習。 – badboy11 2012-02-06 16:51:49

+0

@ badboy11不用客氣。如果你想要「在這裏複製並粘貼這個文件,在這個命名空間中」,也可以在命名空間中「#include」。在類聲明中看到'#include'更常見。 – justin 2012-02-06 20:21:02