Implementare Abstract Factory in c++

di il
1 risposte

Implementare Abstract Factory in c++

Salve a tutti, ho il seguente esercizio :
Si implementi un'Abstract Factory per la creazione delle seguenti tipologie di oggetti : PlayerSprite e GameMap, ognuno dei quali può avere due tipologie, una adatta agli schermi degli smartphone ed una adatta ai tablet che implementano in modo diverso il metodo draw() ed impostano le dimensioni width e height a valori diversi secondo il tipo di schermo. Completare dove richiesto il programma della funzione start().

ho fatto l'uml e ho scritto il codice, ma un errore non lo fa eseguire

[ 50%] Building CXX object CMakeFiles/esercizio_4.dir/main.cpp.o
[100%] Linking CXX executable esercizio_4
Undefined symbols for architecture x86_64:
"TabletPlayer::TabletPlayer()", referenced from:
ConcreteFactory2::create_player() in main.cpp.o
"SmartPhoneMap::SmartPhoneMap()", referenced from:
ConcreteFactory1::create_map() in main.cpp.o
"SmartPhonePlayer::SmartPhonePlayer()", referenced from:
ConcreteFactory1::create_player() in main.cpp.o
"TabletMap::TabletMap()", referenced from:
ConcreteFactory2::create_map() in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)



ho il seguente codice


#include <iostream>
#include <string>
class GameMap{
public:
    GameMap(int l, int w, int h)
    {
        level = l;
        width = height;
        height = h;
    };//FIXME:scrivere il costruttore

    virtual ~GameMap();
    virtual void draw() = 0;
    //...
    int getLevel(){
        return level;
    }
    int getWidth(){
        return width;
    }
    int getHeight(){
        return height;
    }
protected:
    int level;//FIXME: scrivere metodi getter degli attributi
    int width, height;
};


class PlayerSprite {
public:
    PlayerSprite(std::string name, int w, int h){
        this->name = name;
        width = w;
        height = h;
    };//FIXME: scrivere costruttore

    virtual~ PlayerSprite(){};

    virtual void draw(int x, int y) = 0;
    //...
    std::string getName(){
        return this->name;
    }
    int getWidth(){
        return width;
    }

    int getHeight(){
        return height;
    }
protected:
    std::string name; //FIXME :scrivere metodi getter degli attributi
    int width, height;
};
//concrete product A1
class SmartPhonePlayer:public PlayerSprite{
public:
    SmartPhonePlayer();
    ~SmartPhonePlayer(){};
    virtual void draw (int x, int y) override{
        std::cout<<"SmartphonePlayer: altezza "<< x <<"larghezza"<< y <<std::endl;
    }
};
//concrete product A2
class TabletPlayer:public PlayerSprite{
public:
    TabletPlayer();
    ~TabletPlayer(){};
    virtual void draw(int x, int y)override{
        std::cout << "TabletPlayer :altezza "<< x <<"larghezza"<< y <<std::endl;
    }
};
//concrete product B1
class SmartPhoneMap:public GameMap{
public:
    SmartPhoneMap();
    ~SmartPhoneMap(){};
    virtual void draw()override{
        std::cout<<"SmartPhoneMap" <<std::endl;
    }
};
//concrete product B2
class TabletMap: public GameMap{
public:
    TabletMap();
    ~TabletMap(){};
    virtual void draw()override{
        std::cout<<"TabletMap" <<std::endl;
    }
};

class Factory {
public:
    virtual PlayerSprite* create_player() = 0;
    virtual GameMap * create_map() = 0;
};

//concrete Factory
class ConcreteFactory1 : public Factory{
public:
     PlayerSprite* create_player(){
        return new SmartPhonePlayer();
    }
     GameMap* create_map(){
        return new SmartPhoneMap();
    }
};

class ConcreteFactory2 : public Factory{
public:
    PlayerSprite* create_player() {
        return new TabletPlayer();
    }
    GameMap* create_map(){
        return new TabletMap();
    }
};

int main() {
    //int start(bool isTablet){
        //FIXME add code to create correct factory here
        Factory *fact ;
      //  if (isTablet) {
            //FIXME
            fact = new ConcreteFactory2();
       // } else {
            //FIXME
            fact = new ConcreteFactory1();
        //}
            //HeroSprite * hs = 0;
            PlayerSprite *hs = 0;
            GameMap *gm = 0;
            //FIXME add creation of graphics using factory
            hs = fact->create_player();
            gm = fact->create_map();
            gm->draw();
            hs->draw(3, 5);

            return 0;
        //}
    };
secondo voi cosa c'è che non va?, il dubbio principale è su come verificare che tutto funzioni, cioè nel main, l'errore sembra riguardare i costruttori, li devo inizializzare, come posso fare??

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte