Абстрактные функции

У меня небольшая проблема с упражнением. У меня есть 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: статический класс ConcreteClass * __cdecl ConcreteClass :: CreateConcreteClass (char const *)» (? CreateConcreteClass @ ConcreteClass @@ SAPAV1 @ PBD @ Z)

на этой последней строке. Зачем ?

0

Решение

Ах, понял

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

не является декларацией:

ConcreteClass::CreateConcreteClass(s)

Я оставлю это вам, чтобы выяснить, что это за исправление, так как это хороший опыт обучения, и я на 100% уверен, что вам не нужно практиковать копирование и пасту — или вы можете просто подождать, потому что я Я уверен, что кто-то еще скоро опубликует «фиксированный» ответ, просто потому, что ему все равно, учитесь вы или нет.

Изменить: уточнить. Вы объявили статическую функцию-член в классе. И вы определили статическую функцию, которая не является членом какого-либо класса.

5

Другие решения

Вы заявляете 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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector