我的运动有点问题。我有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)
在最后一行。为什么?
答案 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);
}