디자인 모델 의 허구 함수 모델

3120 단어 디자인 모드
1. 허구 함수 모드: "아직 어떤 유형의 대상 이 필요 한 지 모 르 겠 지만 정보 가 있 습 니 다. 적당 한 대상 을 만 드 십시오."
2, 인 스 턴 스 코드:

#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std;

class Shape
{
    Shape* s;
    Shape(const Shape&);
    Shape operator=(Shape&);
//      
//              .
protected:
    Shape(){ s=0; }// :"  " s      .
    //"  " ,s      ,         "  " s   0
public:
    virtual void draw(){ s->draw(); };
    virtual ~Shape() //        
    //      s!=0;
    //   ,  ,  s==0,delete s   .
    {
        cout<<"~Shape"<<endl;
        delete s;// :delete 0  ,      
    }
    class shape_error : public logic_error
    {
    public:
        shape_error(string type):logic_error("Cann't create shape: "+type){}
    };
    Shape(string type) throw(shape_error);
};

class Circle : public Shape
{
    Circle(){}//        ,     
    Circle(const Circle&);
    Circle operator=(Circle&);
    friend class Shape;
public:
    void draw(){ cout<<"Circle:Draw"<<endl; }
    ~Circle(){ cout<<"Circle:~Circle"<<endl; }
};

class Square : public Shape
{
    Square(){}//        ,     
    Square(const Square&);
    Square operator=(Square&);
    friend class Shape;
public:
    void draw(){ cout<<"Square:Draw"<<endl; }
    ~Square(){ cout<<"Square:~Square"<<endl; }
};

//  
Shape::Shape(string type) throw(Shape::shape_error)
{
    if(type=="Circle")
        s=new Circle;
    else if(type=="Square")
        s=new Square;
    else throw shape_error(type);
}

char* sl[] = { "Circle", "Square", "Square", "Circle", "Circle", "Circle", "Square" };
int main()
{
    vector<Shape*> shapes;
    try
    {
        for(size_t i = 0; i < sizeof sl / sizeof sl[0]; i++)
            shapes.push_back(new Shape(sl[i]));//         Shape     .
    } catch(Shape::shape_error& e)
    {
        cout << e.what() << endl;
        for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++)
        {
            delete *ite;
        }
        return EXIT_FAILURE;
    }
    for(size_t i = 0; i < shapes.size(); i++)
    {
        shapes[i]->draw();
    }
    //      : Shape       ,     delete s,      ,      ,     delete s
    //      s=0,       .
    for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++)
    {
        delete *ite;
        cout<<endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기