2013-04-18 42 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其实你并不需要'静态'在你的定义中,但你确实需要它在你的分解 –