2017-07-30 10 views
0
#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

flyweight_pattern.obj:エラーLNK2001:未解決の外部シンボル 「パブリック:静的クラスのstd ::マップ、クラスstd :: allocator>、クラスCircle *、構造体std :: less、クラスstd :: allocator>、クラス std :: allocator、クラスstd :: allocator> const、クラス 円*>>> ShapeFactory :: circlemap " (?circlemap @ ShapeFactory @@ 2V?$ map @ V?$ basic_string @ DU?char_traits @D @ std @@ V?$ allocator @D @ 2 @@ std @@ PAVCir @@@@@@@@@@@ 2 @ V?$ allocator @ U?$ pair @ $ $ CBV?$ basic_string @ DU?$ char_traits @D @ std @@ V?$ allocator @D @ 2 @ std @@ PAVCircle @@@ std @@@ 2 @@ std @A)

私はShapeFactoryクラスのマップを持っていて、クラス自体にマップを塗りつぶしてみましたが、まだ問題を解決できませんでした。あなたはcirclemapを定義されていなかった

+0

静的メンバーを定義するだけです(例:http://cpp.sh/4cznb) –

答えて

0

あなたはそれを定義(および初期化)する必要がありますので、それがグローバルスコープで、静的メンバです:

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

インテグラ不揮発性静的メンバは、クラスで初期化することができます。

ああ、グローバルなスコープでusing namespace std;を実行することはお勧めできません。これは副作用を招きます。

あなたは(この場合はマップ)選択されたIDを対象とする

using std::map; 

のようなものを書くことができ、あなたは利用状況が含まれている名前空間に使用して書くことができます。

+0

私はそれを初期化するのを忘れていました。 – user2230832

関連する問題