2013-04-18 43 views
0

我有一個練習的小問題。我有2類:抽象函數

第一:

namespace Abstract{ 

    class AbstractClass{ 
    public: 

     virtual void setName(const std::string & _name) =0; 
     virtual void print() =0; 
     void DynamicCastTest(){}; 

    }; 

} 

第二:

class ConcreteClass : public Abstract::AbstractClass{ 

    std::string type; 

public: 
    ConcreteClass(); 
    ConcreteClass(const char* a); 
    ~ConcreteClass(); 

    static Abstract::AbstractClass* CreateConcreteClass(const char* a); 

    virtual void setName(const std::string & _name); 
    virtual void print(); 

}; 

而第二類的cpp文件:

#include "concreteClass.h" 

ConcreteClass::ConcreteClass(){ 
    type = ""; 
} 

ConcreteClass::ConcreteClass(const char* a){ 
    type = a; 
} 

ConcreteClass::~ConcreteClass(){} 

static ConcreteClass* CreateConcreteClass(const char* a){ 
    return new ConcreteClass(a); 
} 

void ConcreteClass::setName(const std::string & _name){ 
    type = _name; 
} 

void ConcreteClass::print(){ 
    std::cout<<type<<std::endl; 
} 

但在我的主,當我打電話時:

const char* s = ""; 
Abstract::AbstractClass* a = ConcreteClass::CreateConcreteClass(s); 

在編譯時,Visual了我一個錯誤LNK2019:

? 「市民:靜態類具體類* __cdecl具體類:: CreateConcreteClass(字符常量*)」(CreateConcreteClass @具體類@@ SAPAV1 @ PBD @ Z)

在最後一行。爲什麼?

+0

錯誤標題:這是C++代碼,而不是C!並請顯示完整的錯誤信息。 –

+0

錯誤所指的「符號」是什麼? –

+0

編輯完整錯誤代碼 – Apaachee

回答

5

啊,我明白了:

static ConcreteClass* CreateConcreteClass(const char* a){ 
    return new ConcreteClass(a); 
} 

不是聲明:

ConcreteClass::CreateConcreteClass(s) 

我要把它留給你找出解決辦法是什麼,因爲它是一個很好的學習經驗,並且我100%肯定你不需要練習copy'n'paste - 或者你可以等待,因爲我確信其他人很快就會發佈一個「固定」的答案,只是因爲他們不關心如果你學習與否。

編輯:澄清。你已經在類中聲明瞭一個靜態成員函數。而且你已經定義了一個不是任何類的成員的靜態函數。

+0

這並不是說他們不在乎你是否學習,而是他們想爲自己贏得聲望點。 +1在正確的方向提供溫和的提示。 –

+0

嗯,這是一個靜態函數,所以我可以用'ConcreteClass ::'命名空間調用它,然後函數名稱是'CreateConcreteClass',所以對我來說這是很好的聲明? – Apaachee

+0

嗯,我想這是我的答案不會很好,因爲我的預測成真。請隨時按CTRL-C + CTRL-V Shafik的答案。 –

0

您聲明CreateConcreateClass爲:

static Abstract::AbstractClass* CreateConcreteClass(const char* a); 

,但後來在我們這,這是一個靜態的功能,但不是你在你的類中聲明的一個:

static ConcreteClass* CreateConcreteClass(const char* a){ 
    return new ConcreteClass(a); 
} 

簽名有匹配你的聲明,所以它應該是這樣的:

Abstract::AbstractClass* ConcreteClass::CreateConcreteClass(const char* a){ 
    return new ConcreteClass(a); 
} 
+0

正確...我不需要在聲明中寫靜態詞嗎? – Apaachee

+0

問題是'Abstract :: AbstractClass * ConcreteClass :: CreateConcreteClass' 不等於 'Static ConcreteClass * CreateConcreteClass' 即使沒有靜態,返回類型也不相同。 – SlxS

+0

@PierreBesses其實你並不需要'靜態'在你的定義中,但你確實需要它在你的分解 –