抽象功能

时间:2013-04-18 11:57:00

标签: c++ function abstract

我的运动有点问题。我有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);

在编译中,我看了一个错误LNK2019:

  

“public:static class ConcreteClass * __cdecl ConcreteClass :: CreateConcreteClass(char const *)”(?CreateConcreteClass @ ConcreteClass @@ SAPAV1 @ PBD @ Z)

在最后一行。为什么?

2 个答案:

答案 0 :(得分:5)

啊,明白了:

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

不是声明:

ConcreteClass::CreateConcreteClass(s)

我会留给你弄清楚修复是什么,因为这是一个很好的学习经历,而且我100%确定你不需要练习copy'n'paste - 或者你可以等待,因为我相信其他人很快会发布一个“固定”的答案,只是因为他们不在乎你是否学习。

编辑:澄清。您已在类中声明了静态成员函数。并且您已经定义了一个不是任何类的成员的静态函数。

答案 1 :(得分: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);
}