2013-04-14 3 views
-2

Я знаю, что мне не хватает одной из тех деталей, которые вы не можете просто заметить, а затем через месяц она поражает вас «Эврика!».Абстрактная фабрика - получение сообщения об ошибке смерти LKN2019

В принципе, мне нужно реализовать абстрактный заводский класс для фигур, но я продолжаю получать сообщение об ошибке LKN2019, связанное с .obj, созданным на основе моего заводского кода формы.

Это выглядит немного как это:

shapefactory.h

#ifndef SHAPEFACTORY_H__ 
#define SHAPEFACTORY_H__ 

#include <iostream> 
#include <map> 
#include <string> 
#include "shape.h" 
#include "circle.h" 
#include "rectangle.h" 
#include "triangle.h" 

using namespace std; 

typedef Shape *(createShapeFunction)(void); 




class ShapeFactory 
{ 
public: 
    static void registerFunction(const string &, const createShapeFunction *); 
    static Shape *createShape(const string &); 
    static Shape *createShape(istream &); 
private: 
    static map <string, createShapeFunction *> creationFunctions; 
    ShapeFactory(); 
    static ShapeFactory *getShapeFactory(); 
}; 




#endif 

shapefactory.cpp

#include "shapefactory.h" 





void ShapeFactory::registerFunction(const string & ID, const crateShapeFunction * CR) 
{ 
    creationFunctions[ID] = CR; 
} 




Shape* ShapeFactory::createShape(const string & shapeName) 
{ 
    map <string, crateShapeFunction *>::iterator it = creationFunctions.find(shapeName); 
    if(it != creationFunctions.end()) 
     return it->second(); 
    return NULL; 

} 


Shape* ShapeFactory::createShape(istream & in) 
{ 
    string shapeName; 
    cout << "Desired figure: "; 
    in >> shapeName; 

    map <string, crateShapeFunction *>::iterator it = creationFunctions.find(shapeName); 
    if(it != creationFunctions.end()) 
     return it->second(); 

    return NULL; 

} 



ShapeFactory::ShapeFactory() 
{ 

    registerFunction("circle", &Circle::Create); 
    registerFunction("rectangle", &Rectangle::Create); 
    registerFunction("triangle", &Triangle::Create); 

} 



ShapeFactory* ShapeFactory::getShapeFactory() 
{ 
    static ShapeFactory instance; 
    return &instance; 
} 

я, наверное, облажались где-то в реализации методов, но я просто не может видеть, где. Будем очень благодарны за любую своевременную помощь.

Edit: Ошибки выглядела как этот

Error 4 ошибки LNK2001: неразрешенный внешний символ «частный: статический класс зОго :: Карта, класс зОго ::>, распределитель класс Shape * (__cdecl *) (пустота), struct std :: less, class std :: allocator>>, class std :: allocator, class std :: allocator> const, class Shape * (__cdecl *) (void)>>> ShapeFactory :: creationFunctions "(? creationFunctions @ ShapeFactory @@ 0В? $ Карта @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ P6APAVShape @@ XZU? $ меньше @ V? $ basic_string @DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 2 @ V? $ распределитель @ U? $ пара @ $$ ОЦК? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ P6APAVShape @@ XZ @ std @@@ 2 @@ std @@ A) C: \ Proj1 \ shapefactory.obj

, прежде чем определять карту в моем заголовке, как предложил alexrider. Спасибо, сейчас работает.

+3

Пожалуйста, включите ** сообщение об ошибке ** **. «LKN2019» - это только часть полученного вами сообщения. –

+3

Выполнение 'using namespace std;' в файлах заголовков может сильно удивить в ближайшее время. –

ответ

1

Вы недостающее определение static map <string, createShapeFunction *> creationFunctions;
Это может быть исправлено путем добавления

map <string, createShapeFunction *> ShapeFactory::creationFunctions; 

В shapefactory.cpp
BTW вставив фактическое сообщение об ошибке вы получите будет полезно.

Смежные вопросы