在创建flyweight_pattern时获取链接错误

时间:2017-07-30 06:41:42

标签: c++ c++11 struct stl

#include <iostream>
#include <map>
#include <string>
#include <cstdlib>

using namespace std;

class Shape 
{
public :
    virtual void draw()=0;
    virtual ~Shape(){}
};

class Circle : public Shape
{
   string color;
   int x;
   int y;
   int radius;
public:
  Circle(string color){
      color = color;        
   }

    void setX(int x) {
       x = x;
   }

    void setY(int y) {
      y = y;
   }

    void setRadius(int radius) {
      radius = radius;
   }
    void draw() {
     cout << "color :" << color << x << y ; 
   }
};

class ShapeFactory {
public:
    static map<string, Shape*> circlemap;
    static Shape* getcircle(string color)
    {
        Shape *mcircle;
        mcircle = circlemap.find(color)->second;
        if(mcircle == nullptr) {
         mcircle = new Circle(color);
         circlemap[color] = mcircle;
        // circlemap.insert(std::make_pair(color,mcircle));
        }
        return mcircle;
    }

};

class Flyweightpattern
{
public:

    static string getRandomColor(string colors[]) {
      int m_rand = rand() % 5; 
      return colors[m_rand];
   }
    static int getRandomX() {
      return (int)(rand() % 100);
   }
    static int getRandomY() {
      return (int)(rand() % 100);
   }

};

int main()
{
    string colors[] = { "Red", "Green", "Blue", "White", "Black" };

      for(int i=0; i < 20; ++i) {
         Circle *circle = dynamic_cast<Circle *>(ShapeFactory::getcircle(Flyweightpattern::getRandomColor(colors)));
         circle->setX(Flyweightpattern::getRandomX());
         circle->setY(Flyweightpattern::getRandomY());
         circle->setRadius(100);
         circle->draw();
      }

      getchar();
      return 0;
   }

我在运行期间收到链接错误如下:

  

flyweight_pattern.obj:错误LNK2001:未解析的外部符号   &#34; public:static class std :: map,class std :: allocator&gt;,class Circle   *,struct std :: less,class std :: allocator&gt; &GT;,类   std :: allocator,class std :: allocator&gt; const,class   圆圈*&gt; &GT; &GT; ShapeFactory :: circlemap&#34;   (?circlemap @ @@ ShapeFactory 2V?$地图@ V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ PAVCircle @@ U&$ @少V· $ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$ @配对$$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ PAVCircle @@@ STD @@@ 2 @@ STD @@ A)

我在ShapeFactory类中有一个地图,并尝试在类本身中创建填充地图,但仍然无法解决问题。

1 个答案:

答案 0 :(得分:0)

你没有定义circlemap,它是一个静态成员,所以你应该在全局范围内定义它(并初始化):

map<string, Shape*> ShapeFactory::circlemap = {};

可以在课堂上初始化积分非易失性静态成员。

哦,不建议在全球范围内进行using namespace std;,这会导致副作用。

您可以编写类似

的内容
using std::map; 

定位所选的id(在本例中为map),您可以在包含用法的命名空间中使用。