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(); 

};

そして、2 番目のクラスの 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: static class ConcreteClass * __cdecl ConcreteClass::CreateConcreteClass(char const *)」 (?CreateConcreteClass@ConcreteClass@@SAPAV1@PBD@Z)

この最後の行に。なんで ?

4

2 に答える 2

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 に答える