tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
352
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Fussballgott19 Fussballgott19 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    20
    Kennt jemand ein komplettes Beispiel für die Anwendung der Fabrikmethode? Bitte nicht das von wikipedia!! Eines bei dem aus dem int main Parameter übergeben werden.

    Ich verstehe ja den Sinn und auch die Funtionsweise der Fabrikmethode nur bin ich anscheinend zu doof dieses in meinem Prog umzusetzen. Ich habe vier Klassen erstellt Produkt, konkretes Produkt, Erzeuger und konkreter Erzeuger. Das konkrete Produkt erwartet nun als Aufruf drei Sting-Parameter. Jedes Beispiel im Internet ist irgendwie anders und ich bin langsam ziemlich verwirrt. Wie muss ich das dann vom main-prog aufrufen?

    Hat jemand ein Beispiel von euch, dass von vorne bis hinten komplett ist? Ich habe auch schon in der Bibel Desing Patterns gelesen, aber auch da ist kein komplettes durchgängiges Beispiel.

    Danke
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Im Wiki-Beispiel, auf das du eh schon verwiesen hast, kriegt die Rostwurst eh Parameter mitgeliefert. Ob du da jetzt eines wie im Beispiel, oder 3 hast ist ziemlich egal.

    Edit: Oder meinst du das die Methode in der Factory die dein Produkt erstellt drei Parameter bekommen soll? Dann müsste aber die Parameteranzahl für alle Produkte gleich sein, da du sonst die Funktion nicht überschreiben können wirst.
    Geändert von Steiner_B (15.09.11 um 11:21 Uhr)
     

  3. #3
    Fussballgott19 Fussballgott19 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    20
    Also ich möchte aus int main drei string variablen übergeben. Was genau muss ich aus int main denn heraus aufrufen? Ich bin ziemlich verwirrt da es in irgendwie jedem Beispiel anders gemacht wird. Im wiki-Beispiel werden aus main keine Parameter mitgegeben.
     

  4. #4
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Um beim Wiki-Beispiel zu bleiben: Du könntest liefereMahlzeit und bereiteMahlzeitZu mit jeweils 3 string-Parameter ausstatten. Dann kannst dus von der Main aus aufrufen.
     

  5. #5
    Fussballgott19 Fussballgott19 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    20
    So sehen meine Klassen im Moment aus: Wie übergebe ich jetzt aus Main heraus die drei Strings? Irgendwie leuchtet mir das noch nicht so ganz ein! Danke

    int main:
    Code :
    1
    2
    
    Creator_ClusterGraph ccg;
    ccg.creategraph(*startparameter, inipath, codespath);

    Erzeuger
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    class Creator
    {
    public:
    Prod_Graph* getGraph();
        //Creator(void);
        //~Creator(void);
    protected:
    Prod_Graph* _graph;
    virtual Prod_Graph* creategraph() = 0;
    };
    Prod_Graph* Creator::getGraph()
    {
        creategraph();
        return new Prod_Graph;
    }

    Konkreter Erzeuger
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class Creator_ClusterGraph : public Creator
    {
    public:
    virtual Prod_Graph* creategraph(string *startparameter, string inipath, string codespath);
    };
    Prod_Graph* Creator_ClusterGraph::creategraph(string *startparameter, string inipath, string codespath)
    {
    return new Prod_ClusterGraph();
    }

    Produkt
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    class Prod_Graph
    {
    public:
    Prod_Graph(void);
    ~Prod_Graph(void);
    };
    Prod_Graph::Prod_Graph(void)
    {
    }
    Prod_Graph::~Prod_Graph(void)
    {
    }

    konkretes Produkt
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    class Prod_ClusterGraph : public Prod_Graph
    {
    public:
    Prod_ClusterGraph(string *startparameter, string inipath, string codespath);
    Prod_ClusterGraph(void);
    ~Prod_ClusterGraph(void);
    };
    Prod_ClusterGraph::Prod_ClusterGraph(string *startparameter, string inipath, string codespath)
    {
    //hier werden funktionen ausgeführt******
    }
     

  6. #6
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,
    Mal vorweg:

    Code cpp:
    1
    2
    
    creategraph();
    return new Prod_Graph;

    muss soweit ich deinen Code jetzt verstehe
    Code cpp:
    1
    
    return creategraph();
    heißen.

    Zu deinem Problem:
    Das hängt davon ab ob alle abgeleiteten Klassen von Prod_Graph die 3 Parameter brauchen oder nicht. Allgemein kannst du die Funktion wie folgt schreiben:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    class Creator
    {
    public:
    Prod_Graph* getGraph();
        //Creator(void);
        //~Creator(void);
    protected:
    Prod_Graph* _graph;
    virtual Prod_Graph* creategraph(void** parameter) = 0;
    };
    Prod_Graph* Creator::getGraph(void** parameter)
    {
        return creategraph(parameter);
    }

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class Creator_ClusterGraph : public Creator
    {
    public:
    virtual Prod_Graph* creategraph(void** parameter);
    };
    Prod_Graph* Creator_ClusterGraph::creategraph(void** parameter)
    {
    return new Prod_ClusterGraph((string*)parameter[0], (string)*parameter[1], (string)*parameter[2]);
    }

    Aufruf aus der Main irgendwie so:
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    void ** myparam = new void*[3];
    myparam[0] = (void*)startparameter;
    myparam[1] = (void*)&initpath;
    myparam[2] = (void*)&codespath;
     
    ccg.creategraph(myparam);

    Sollten alle deine Prod-Klassen die drei Parameter erwarten, kannst du natürlich statt den void* parameter-Liste gleich die drei Parameter verwenden.