Factory-Klasse richtig gestalten



  • Hallo,

    ich verzweifle leider aktuell an dem Management meiner Daten, ich hoffe ihr könnt mir helfend zur Seite stehen. Ich sage gleich zu Anfang, dass ich noch kein ausgelernter C++ Profi bin und bin deswegen für kleinschrittige Erklärungen sehr dankbar.

    Meine Klassenhierarchie:

    StandartItem
    |
    -------
    | |
    UpgradeableItem Normalitem

    (EDIT: Da man das leider nicht richtig erkennt: Standartitem ist Oberklasse der beiden anderen)

    Beide Unterklassen haben dann wieder einige Unterklassen, aber das ist im Grunde egal. Alle Klassen haben jedenfalls die Public-Methode loadFromJSON. Alles ist so gegliedert, dass diese Methode natürlich immer alle alten Methoden der vorgängerklassen am Anfang aufruft. Nun zu meinem "Problem":

    Ich möchte alle meine Daten zusammen in einer Liste abspeichern (ich benutze QList ist aber ja irrelevant). Der Type der Items dieser Liste soll nun StandartItem sein. Ich möchte aber dieser Liste auch NormalItems und UpgradeableItems hinzufügen können, was durch die Vererbung ja problemlos funktionieren sollte. Ich frage mich nur wie. In meinem Kopf schwirrt folgende Idee:

    StandartItem factoryFunc(JSON json) {
      if (json.type == normal)
        return NormalItem.fromJSON(json)
      else
        return UpgradeableItem.fromJSON(json);
    }
    
    //Aufruf dann
    list.add(factoryFunc(json));
    

    Das ist natürlich Pseudocode, aber ich habe leider absolut keine Ahnung, wie ich da vorgehen muss. MUSS ich hier mit Pointern arbeiten oder geht das auch anders?

    Vielen Dank für alle eure Hinweise 🙂



  • du kannst keiner Value Objekte auf die Basisklasse casten,
    da dann das passiert
    https://en.wikipedia.org/wiki/Object_slicing

    du musst pointer oder references verwenden

    pseudo code

    unique_ptr<StandardItem> factory(JSON json)
    {
      unique_ptr<StandardItem> item ;
    
      if (json.type == normal)
        item.reset(new NormalItem()) ;
      else
        item.reset(new UpgradeableItem()) ;
    
      item->fromJSON(json) ;
    
      return item ; 
    }
    

    so bekommst du pointer auf die base klasse und die sind polymorph, was das ist was du suchst,
    daher 'c++ polymorphism' in die Suchmaschine und einlesen



  • vielen Dank, mit Polymorph hatte ich mich im Vorfeld schon beschäftigt. Dann werde ich das mal so umsetzen, vielen Dank!



  • An der Stelle wäre evtl. auch sinnvoll, die Objekte direkt im Konstruktor aus dem JSON zu konstruieren:

    std::unique_ptr< StandardItem > item_from_json( const JSON& json )
    {
      return json.type == normal
        ? std::make_unique< NormalItem >( json )
        : std::make_unique< UpgradeableItem >( json );
    }
    

Anmelden zum Antworten