2013-04-18 3 views
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(); 

}; 

И СРР файл второго класса:

#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 вне меня LNK2019 ошибка:

? "Общественность: статический класс ConcreteClass * __cdecl ConcreteClass :: CreateConcreteClass (символ сопз *)" (CreateConcreteClass @ ConcreteClass @@ SAPAV1 @ PBD @ Z)

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

+0

Неверное название: это код на C++, а не C! И, пожалуйста, покажите полное сообщение об ошибке. –

+0

Что означает «символ», на который указывает ошибка? –

+0

Отредактировано с полным кодом ошибки – Apaachee

ответ

5

Ах, он получил:

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

не декларация:

ConcreteClass::CreateConcreteClass(s) 

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

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

+0

Дело не в том, что им все равно, узнаете ли вы, что им нужны очки репутации для себя. +1 для нежного намека в правильном направлении. –

+0

Хм, это статическая функция, поэтому я могу назвать ее пространством имен ConcreteClass ::, тогда имя функции будет «CreateConcreteClass», поэтому для меня это хорошая декларация? – Apaachee

+0

Ну, я думаю, это мой ответ не будет хорошим, поскольку мое предсказание сбылось. Пожалуйста, не стесняйтесь ответа CTRL-C + CTRL-V Shafik. –

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); 
} 
+0

Правильно ... Мне не нужно писать статическое слово в декларации? – Apaachee

+0

Проблема: 'Аннотация :: AbstractClass * ConcreteClass :: CreateConcreteClass' не равно ' static ConcreteClass * CreateConcreteClass' Даже без статического типа возвращаемого значения не совпадают. – SlxS

+0

@PierreBesses На самом деле вам не нужно 'static' в вашем определении, но вам это нужно в вашем delcaration –