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 out me 一个错误 LNK2019 :

"public: 静态类 ConcreteClass * __cdecl ConcreteClass::CreateConcreteClass(char const *)" (?CreateConcreteClass@ConcreteClass@@SAPAV1@PBD@Z)

在这最后一行。为什么 ?

4

2 回答 2

5

啊,明白了:

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

不是以下声明:

ConcreteClass::CreateConcreteClass(s)

我会留给你弄清楚修复是什么,因为这是一个很好的学习体验,而且我 100% 确定你不需要练习复制粘贴 - 或者你可以等待,因为我'确定其他人很快就会发布“固定”答案,仅仅是因为他们不在乎你是否学习。

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

于 2013-04-18T12:06:24.567 回答
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);
}
于 2013-04-18T12:10:34.287 回答