⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fabricadefig2.cpp

📁 descriere descriere descriere
💻 CPP
字号:
#pragma warning(disable:4786)
#pragma warning(disable:4083)
#include <iostream>
#include <fstream>
#include <map>
#include <list>

using namespace std;

class Figura 
{
public:
	Figura()
	{ 
	//	std::cout << "Figura();\n";
	}
	virtual void citeste(std::ifstream&) =0;
	virtual void Afis(std::ofstream&) =0;
};


class FabricaDeFigBaza
{

public:

    typedef Figura* (*DelegatCreareFig)();
    
	FabricaDeFigBaza() {  }
    
	bool inregistreazaFig(int figId, DelegatCreareFig fctCreare);   // intoarce "true" daca inregistrarea este OK
    
	bool elimina(int figId);										// intoarce 'true' daca figura a fost inregistrata inainte
   
	Figura* creeazaFig(int figId);

private:

    typedef std::map<int, DelegatCreareFig> DelegatMap;
    DelegatMap delegati_;
};

bool FabricaDeFigBaza::inregistreazaFig(int figId,
     DelegatCreareFig fctCreare)
{
    return delegati_.insert(
         DelegatMap::value_type(figId, fctCreare)).second;
}

bool FabricaDeFigBaza::elimina(int figId)
{
    return delegati_.erase(figId) == 1;
            
}

Figura* FabricaDeFigBaza::creeazaFig(int figId)
{
    DelegatMap::const_iterator i = delegati_.find(figId);
    if (i == delegati_.end())
    {
        // nu a gasit
        throw "ID de figura necunoscut\n";
    }
    // invoca functia de creare
    return (i->second)();
}

//
// fabrica cu o singura instanta
//

class FabricaDeFig : public FabricaDeFigBaza
{
public:
  static FabricaDeFig& Instanta() {return fabricaFig;}
private:
  static FabricaDeFig fabricaFig;
  FabricaDeFig() { }
  void operator=(FabricaDeFig&);
  FabricaDeFig(const FabricaDeFig&);
};

FabricaDeFig FabricaDeFig::fabricaFig;

//
// containerul de figuri
//

class ContainerFig
{
private:
	std::list<Figura *> cntnr;
public:
	ContainerFig() {}
	~ContainerFig() {}
	void incarca(std::ifstream&);
	void ScrieFisier(std::ofstream&);
};

void ContainerFig::incarca(std::ifstream& inp)
{
    int figId;
	// citeste tipul figurii
	inp >> figId;
    while (inp)
    {
        //creeaza un obiect vid
		Figura* pfig = FabricaDeFig::Instanta().creeazaFig(figId);
		// incarca obiectul
        pfig->citeste(inp);
		cntnr.push_back(pfig);
		
		// citeste tipul noii figuri
		inp >> figId;
    }
}

void ContainerFig::ScrieFisier(std::ofstream& out)
{
	int figId;
	Figura* pfig ;//= FabricaDeFig::Instanta().creeazaFig(1);
	while (!cntnr.empty())
	{
		pfig = cntnr.front();
		cntnr.pop_front();
		pfig->Afis(out);
	}


}

class Cerc : public Figura
{
private :
	double x,y,r;
	int ID;
public:
	Cerc()
	{
		std::cout << "Cerc\n";
		ID=1;
	}
	virtual void citeste(std::ifstream& is) 
	{
		is >> x >> y >> r;
	}
	
	virtual void Afis(std::ofstream& is) 
	{
		is << ID << endl;
		is << x <<" " << y<<" " << r<< endl;
	}
};

namespace
{
    Figura* creeazaCerc()
    {
        return new Cerc;
    }
    // Id-ul pentru segment
    const int CERCID = 1;
    // inregistreaza
    const bool registeredCERC =
        FabricaDeFig::Instanta().inregistreazaFig(CERCID, creeazaCerc);
};

class Patrat : public Figura
{
private:
	double x,y,l;
	int ID;
public:
	Patrat()
	{
		std::cout << "Patrat \n";
		ID=2;
	}
	virtual void citeste(std::ifstream& is) 
	{
		is >> x >> y >> l;
	}
	virtual void Afis(std::ofstream& is) 
	{
		is << ID << endl;
		is << x <<" " << y<<" "  << l<< endl;
	}
};


// implementarea modulului pentru Segment
// creeaza un spatiu anonim pentru a face functia invizibila 
// pentru alte module

namespace
{
    Figura* creeazaPatrat()
    {
        return new Patrat;
    }
    // Id-ul pentru segment
    const int PATRATID = 2;
    // inregistreaza
    const bool registeredPATRAT =
        FabricaDeFig::Instanta().inregistreazaFig(PATRATID, creeazaPatrat);
}

class Triunghi : public Figura
{
private :
	double x1,x2,x3,y1,y2,y3;
	int ID;
public:
	Triunghi()
	{
		std::cout << "Triunghi \n";
		ID=3;
	}
	virtual void citeste(std::ifstream& is) 
	{
		is >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
	}
	
	virtual void Afis(std::ofstream& is) 
	{
		is << ID << endl;
		is << x1 <<" " << y1<<" "  << x2<<" "  << y2<<" "  << x3<<" "  << y3<<" " << endl;
	}

};


// implementarea modulului pentru Segment
// creeaza un spatiu anonim pentru a face functia invizibila 
// pentru alte module

namespace
{
    Figura* creeazaTriunghi()
    {
        return new Triunghi;
    }
    // Id-ul pentru segment
    const int TRID = 3;
    // inregistreaza
    const bool registeredTR =
        FabricaDeFig::Instanta().inregistreazaFig(TRID, creeazaTriunghi);
}

void main()
{
		ContainerFig  cf;
	try {
		std::ifstream inp("inp.dat");
		cf.incarca(inp);
		inp.close();
		//return 0;
	}
	catch (char* msg)
	{
		std::cout << msg;
	}
	std::ofstream out("out.dat");
	cf.ScrieFisier(out);
	out.close();
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -