C++ geinitialiseerde klasse overerven

Pagina: 1
Acties:
  • 187 views sinds 30-01-2008
  • Reageer

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
Klinkt ingewikkeld, maar zie hetvolgende:

Ik heb een receptklasse met daarin naam, ingredienten.

Nu kan je verschillende producten hebben die hetzelfde recept gebruiken.

Volgens de OOP data regels is een produckt klasse dus een recept met een aantal toevoegingen, zoals hoeveelheid (dit hoort niet bij recept, want die bepaald de samenstelling, en niet de hoeveelheid. )

Ok ik heb nu dus een recept: new recipe("koekjes");
met daarin alle ingredienten,

Mijn probleem is nu, ik wil alle eigenschappen van recipe overerven in product, inclusief de samenstelling, zodat ik ook voor bijvoorbeeld elk ingredient ook velden kan toevoegen.

Ik ben wel zover dat ik een copy constructor (zodat ik new product Koekjes; Koekjes=recipe("koekjes"); )kan maken voor class product : recipe {} maar ik vraag me af of dat de enige manier is.

Kan je dus een geinitialiseerde klasse overerven ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:49
Een geinitialiseerde klasse?
Een class is een 'blueprint', zegmaar een beschrijving van hoe de object van uw class er uit gaan zien.
Een object is een instance van een class, en een object gaat dan gegevens gaan bevatten. Een class zelf kan geen gegevens bevatten (tenzij je het over static data members hebt, dit zijn gegevens die voor iedere instance van die class gelijk zijn).

Ik begrijp dus niet goed wat je bedoeld met een 'geinitialiseerde class'?

https://fgheysels.github.io/


  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02 16:26
Op donderdag 14 februari 2002 10:51 schreef ilrenato het volgende:
dit hoort niet bij recept, want die bepaald de samenstelling, en niet de hoeveelheid.
Wanneer ik een willekeurig kookboek opensla staat er bij het recept ook de hoeveelheid...

Je kan het probleem makkelijk oplossen door van de 'Is a' relatie een 'Has a' relatie te maken.

Je krijgt dan bijvoorbeeld de volgende produktklasse:
code:
1
2
3
4
5
6
7
8
9
10
11
public class KoekjesProdukt extends/implements Produkt {
Recept recept;
   public KoekjesProdukt () {
    this.recept = new Recept ("koekjes");
   }
   
   // of
   public KoekjesProdukt (Recept recept) {
    this.recept = recept;
   }
}

Weliswaar in java maar ik denk dat het idee duidelijk is.

Aggregatie is flexibeler dan derivatie.

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
Ok, het object (instance van de class dus) moet hetzelfde zijn, met een aantal toevoegingen.

Ik heb in het recept een stl vector met ingredienten, die kopieer ik nu in het product, maar dan met nieuwe velden, het is echt lastig allemaal. Maar misschien is het wel de manier.

Een product "is een" recipe of "has a" recipe
volgens mij dus is een , met toevoegingen (velden).

Een product staat het toe dat hetzelfde recept 2 keer wordt gemaakt met verschillende hoeveelheden. En ik kan dus in product niet zeggen new Recipe("koekjes") omdat recipe koekjes al bestaat (is bekend)

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02 16:26
Hmmm, ik begrijp het verschil tussen een recept en een produkt niet helemaal goed. Bedoel je dit:

Recept koekjes:
- mail
- boter
- eieren
- suiker

Produkt sprits:
- 100 gr meel
- 50 gr boter
- 2 eieren
- 100 gr suiker

Zoiets?

Verwijderd

Misschien is het handig als we weten wat de context van je produkten/recepten probleem is. In wat voor systeem heb je deze produkt-recept relatie nodig ?

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
recept witbrood
resource "meel" 100%
resource "zout" 0.1%
resource "gist" 0.53%
resource water" 45 %

new product witbrood 100 stuks
//hier rekent product aan de hand van de percentages het gewicht uit van elk ingredient

En er moet nog een keer voor een andere klant wat gemaakt worden
new product witbrood 30 kg
// hier dus weer een instance van het bestaande recept

In professionele omgevingen werken ze vaak in eerste instantie met een percentage in een recept. (niet in de keuken dus)

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02 16:26
Maar noem nu 's 2 verschillende produkten die van hetzelfde recept gebruik maken? Of is het enige verschil tussen produkt en recept dat bij produkt een aantal op wordt gegeven (in jou voorbeeld dus 100 stuks en 30 kg)?

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
Voor vandaag moet je 50kg maken en morgen 20kg, het recept blijft hetzelfde.
Zie het maar zo dat je een werklijst hebt. En dus 100 stuks moet maken en ook nog eens een keer 20 kg.
In die werklijst staan dus de produkten die je moet maken.
Ik kan de tijdelijke gewichten niet in recept zetten, want als er 2 produkten zijn overschrijven ze elkaar als ze dezelfde has a relatie hebben (en toegang hebben tot het recept dat vast is.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02 16:26
Dan is het simpel:

- je zorgt dat je Recept een immutable klasse is
- een instantie van een produkt hoeft alleen maar een reference naar een recept te hebben en een quantity. Alle verdere berekeningen kunnen nu in de instantie van de produkt klasse uitgevoerd worden.
code:
1
2
3
4
Recept witBrood = new WitBrood ();
Quantity q = new Quantity (10);
Measurement m = new Measurement ("kg");
Produkt p = new Produkt (witBrood, q, m);

Dit maakt dus een nieuw produkt aan van 10 kg witbrood.

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
En mijn tijdelijke velden voor elk ingredient in recept? Die kunnen dus alleen maar gebruikt worden in product als Witbrood() een object aanmaakt van een class Witbrood, maar ik kan natuurlijk niet voor elk recept een klasse schrijven.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02 16:26
Op donderdag 14 februari 2002 14:47 schreef ilrenato het volgende:
En mijn tijdelijke velden voor elk ingredient in recept? Die kunnen dus alleen maar gebruikt worden in product als Witbrood() een object aanmaakt van een class Witbrood, maar ik kan natuurlijk niet voor elk recept een klasse schrijven.
Je mist de pointe een beetje, hoe jij aan je witbrood instantie kan ik natuurlijk niet ruiken (met name door de summiere info die je geeft). Waar het om gaat is dat je door je hele applicatie heen slechts 1 instantie van witbrood hoeft te hebben, en of je dit nu bereikt dmv. een factory of een constante moet je zelf weten. De variabelen en berekeningen die nodig zijn om aan de hand van een Recept en een quantiteit de juiste hoeveelheden te leveren staan natuurlijk in je produkt klasse.

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
Ok tomatix.

Ken jij niet ruiken dan :)

Maar ik heb nu dus inderdaad de recept ingredienten gekopieerd (pointers) in product, en dan velden toegevoegd.
Ziet er allemaal een beetje smerig uit, maar het is wel juist.

Pffff

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Ingredient {
private:
  std::string _omschr;
  double    _perc;

public:
  Ingredient(const std::string& omschrijving, double percentage)
    : _omschr(omschrijving), _perc(percentage) {}

  const std::string& omschrijving() const { return _omschr; }
  double percentage() const { return _perc; }
};

typedef std::vector<Ingredient> Recept;

class Produkt {
private:
  Recept *_recept;
  double _hoeveel;

public:
  Produkt(const Recept& recept, double hoeveelheid)
    : _recept(&recept), _hoeveel(hoeveelheid) {}

  const Recept& recept() const { return *_recept; }
  double hoeveelheid() const { return _hoeveel; }
};

// Recept aanmaken
Recept *witbrood= new Recept();
witbrood->insert(Ingredient("meel", 70));
witbrood->insert(Ingredient("zout", 2));
witbrood->insert(Ingredient("gist", 10));
witbrood->insert(Ingredient("water", 18));

// Produkten met het zelfde recept
Produkt *janssen= new Produkt(*witbrood, 100);
Produkt *pietersen= new Produkt(*witbrood, 30);

Of begrijp ik de vraag ook niet :?

Verwijderd

Op donderdag 14 februari 2002 15:25 schreef mietje het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Ingredient {
private:
  std::string _omschr;
  double    _perc;

public:
  Ingredient(const std::string& omschrijving, double percentage)
    : _omschr(omschrijving), _perc(percentage) {}

  const std::string& omschrijving() const { return _omschr; }
  double percentage() const { return _perc; }
};

typedef std::vector<Ingredient> Recept;

class Produkt {
private:
  Recept *_recept;
  double _hoeveel;

public:
  Produkt(const Recept& recept, double hoeveelheid)
    : _recept(&recept), _hoeveel(hoeveelheid) {}

  const Recept& recept() const { return *_recept; }
  double hoeveelheid() const { return _hoeveel; }
};

// Recept aanmaken
Recept *witbrood= new Recept();
witbrood->insert(Ingredient("meel", 70));
witbrood->insert(Ingredient("zout", 2));
witbrood->insert(Ingredient("gist", 10));
witbrood->insert(Ingredient("water", 18));

// Produkten met het zelfde recept
Produkt *janssen= new Produkt(*witbrood, 100);
Produkt *pietersen= new Produkt(*witbrood, 30);

Of begrijp ik de vraag ook niet :?
Tja... je weet dus nou niet a) hoe je het recept moet klaar maken en b) wat je nou precies klaar maakt.

Verwijderd

Op donderdag 14 februari 2002 15:40 schreef vicz het volgende:
Tja... je weet dus nou niet a) hoe je het recept moet klaar maken en b) wat je nou precies klaar maakt.
code:
1
2
3
4
5
6
7
8
9
const Produkt *prod= janssen;
for(Recept::const_iterator i= prod->recept().begin();
    i != prod->recept().einde();
    ++i)
{
  std::cout << "ingredient: " << i.omschrijving()
    << " totaal: " << i.percentage() * prod->hoeveelheid()
    << std::endl;
}

Je weet dus a) wel, als je elk recept een titel wilt geven moet je een wrapper om std::vector<Ingredient> schrijven, waarin je een string voor die titel opneemt.

Verwijderd

Je zou dus eerder een typedef std:vector<Ingredient> IngredientenLijst aan maken en die in een class Recept stoppen...

note. Je wilt natuurlijk een recept een titel geven anders heb je aan dat hele recept totaal niks.

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 08-12 22:39

ilrenato

Pizzah!!!!

Topicstarter
Het is allemaal niet zo makkelijk, de ingredienten zijn resources. En een resource heeft veel eigenschappen zoals wat is het, waar haal ik het vandaag enz.

Maar het werkt al een beetje hoor, alleen is het lastig om bijvoorbeeld in Product ervoor te zorgen dat Product->Recipe->Ingredient->Resource.make() gaat lopen.

Maar ik kom er wel. Thankx

Verwijderd

Op donderdag 14 februari 2002 16:52 schreef ilrenato het volgende:
Het is allemaal niet zo makkelijk, de ingredienten zijn resources. En een resource heeft veel eigenschappen zoals wat is het, waar haal ik het vandaag enz.

Maar het werkt al een beetje hoor, alleen is het lastig om bijvoorbeeld in Product ervoor te zorgen dat Product->Recipe->Ingredient->Resource.make() gaat lopen.
Neem dan in plaats van de std::string _omschr een Resource *_res op in de class Ingredient. Initialiseer de resources voordat je Ingredient-objects met die resource aanmaakt (net zoals ik in mijn code boven het Recept initialiseer voor ik het gebruik in Produkt-objects).

Je Resource.make() moet uiteraard de berekende hoeveelheid als parameter gepassed krijgen, dus in mijn vorige stukje code iets van i.resource().make(i.percentage() * prod->hoeveelheid());
Pagina: 1