Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   C++: Classes... (https://forum.scholieren.com/showthread.php?t=120249)

eddie 07-06-2002 18:50

ik wil gewoon ff klooten met C++...
Maar ik komt er niet uit...

Ik wil een class hebben (zeg obj2) die afstamt van obj1, en die dus ook de properties mee neemt.

Ik heb dit:
Code:

#include <stdio.h>
#include <stdlib.h>

class obj1
{
  public:
    int width;
    obj1();
    ~obj1();
       
};

obj1::obj1(){ width = 5; };
obj1::~obj1(){ width = 0; };

class obj2 friend obj1
{
  public:
    int height;
    obj2();
    ~obj2();
};

obj2::obj2(){ height = 10; };
obj2::~obj2(){};

void main( void )
{
    obj2  test;
   
    printf( "%d || %d", test.width, test.height);
    system( "PAUSE" );
}

De foutmelding die ik krijg:
`class obj2' has no member named `width'

Ik wil dus een subclass maken...

Tampert 07-06-2002 22:53

hmmnzzz...

okee informatica valt onder dit forum... maar ik denk dat ze dit bij S&M veeeel beter kunnen beantwoorden dusssss

Lethalis 07-06-2002 23:57

http://********.tsd-webservices.nl/t...envatting.html

Lees en huiver ;)

Lethalis 08-06-2002 00:10

Naar jouw voorbeeld:
Code:

#include <iostream.h>

class obj1
{
public:
  int width;
  obj1();
};

class obj2 : public obj1
{
public:
  int height;
  obj2();
};

obj1::obj1()
{
  width = 5;
}

obj2::obj2()
{
  height = 10;
}

int main()
{
  obj2 test;
  cout << test.width << "\n" << test.height << "\n";
  getchar();
}

:)

Tofke_H 08-06-2002 01:02

Je vraag lijkt me beantwoord maar mag ik je vragen hoe jij aan obj1::~obj1() komt? Ik kan me niet herinneren dat ik bij C of C++ een ~ heb gebruikt bij dergelijke dingen.

Lethalis 08-06-2002 07:19

Citaat:

Tofke_H schreef:
Je vraag lijkt me beantwoord maar mag ik je vragen hoe jij aan obj1::~obj1() komt? Ik kan me niet herinneren dat ik bij C of C++ een ~ heb gebruikt bij dergelijke dingen.
Hij definieert de destructor expliciet buiten de klasse :) Geheel zinloos, aangezien deze hier geen nuttige functie heeft. Hij kan wel leuk die variabelen op 0 gaan zetten, maar ze worden een tel later verwijderd uit het geheugen :D

eddie 08-06-2002 10:04

Citaat:

******** schreef:
Naar jouw voorbeeld:
*code*

:)

:eek:

:D :D
Dank! :)

Okee... dat is één... :)
Vraag 2:
Ik heb 3 objecten/classes (obj1, obj2 en obj3). In obj3 wil ik dmv een functie (iets in de trand van addObject() ) een object kunnen toevoegen. Dit kan obj1, obj2 of obj3 zijn. Aan elk van deze toegevoegde objecten, moet ik ook weer objecten kunnen toevoegen, etc...

Ik wil een array hebben (objects) waarin de objecten staan die ik heb toegevoegd, dus bijvoorbeeld:
Code:

obj3 test;

test.addObject( <iets> );
test.addObject( <iets anders> );
test.objects[0].addObject( <iets> );

De functie addObject moet dus in elke class zitten. Er mag bijvoorbeeld een 'masterclass' zijn met deze functie, waar de overige classes van afstammen.

Maak het svp niet tè moeilijk :p :)

eddie 08-06-2002 10:06

Citaat:

******** schreef:
Hij definieert de destructor expliciet buiten de klasse :) Geheel zinloos, aangezien deze hier geen nuttige functie heeft. Hij kan wel leuk die variabelen op 0 gaan zetten, maar ze worden een tel later verwijderd uit het geheugen :D
Jah... boeie!

Ik was druk bezig met pointers en dynamissche geheugelallocaties (niet dat ik het kan ;)), enja... dan ga je vanzelf die functies definieren... :D

McMotion 08-06-2002 15:13

zoiets?

Code:

#include <memory.h>
#define MAX_ITEMS 100;

class TreeNode
{
public:
        int AddNode(TreeNode *Node);
        bool RemoveNode(int iNodeNumber);
        TreeNode *Node(int iNodeNumber);
protected:
        int iNodeCount = 0;
        TreeNode *aSubObjects[MAX_ITEMS];
}

class obj1 : public TreeNode
{
public:
        void Member1();
        void Member2();
}

class obj2 : public TreeNode
{
public:
        void Member1();
        void Member2();
        void Member3();
}

class obj3 : public TreeNode
{
public:
        void MemberA();
        void MemberB();
}

int TreeNode::AddNode(TreeNode *Node)
{
        if(iNodeCount == MAX_ITEMS) return -1;
        aSubObjects[iNodeCount] == Node;
        return iNodeCount++;
}

int TreeNode::RemoveNode(int iNodeNumber)
{
        memcpy(&aSubObjects[iNodeNumber], &aSubObjects[iNodeNumber+1], (iNodeCount - iNodeNumber - 1) * sizeof(TreeNode));
        return --iNodeCount;
}

TreeNode *TreeNode::Node(int iNodeNumber)
{
        return aSubObjects[iNodeNumber];
}


McMotion 08-06-2002 15:15

Citaat:

eddie schreef:

Jah... boeie!

Ik was druk bezig met pointers en dynamissche geheugelallocaties (niet dat ik het kan ;))


ooops je wilde het toch statisch in arrays? dacht ik uit je voorgaande posts op te maken :o

eddie 08-06-2002 15:46

Citaat:

McMotion schreef:



ooops je wilde het toch statisch in arrays? dacht ik uit je voorgaande posts op te maken :o

Jup, was eigenlijk wel de bedoeling...

Dat je dus 'new' en 'delete' gebruikt om je subobjecten te maken en verwijderen. :)

Toch bedankt voor je moeite! :) (y)

*heeft weer iets geleerd*

Ik zal misschien later even de code posten die ik heb... :)

McMotion 08-06-2002 16:12

dan moet je er een linked list van maken dus in elke treenode een pointer naar de volgende treenode.. ik zal zo wel ff die code van mij aanpassen

eddie 08-06-2002 16:35

Hmm... met een linked list kan ik de subclasses niet direct benaderen...

Mijn code (geexporteerd met Dev-C++)

Ik hoop dat mijn idee duidelijk is :)

Lethalis 08-06-2002 16:38

Ik heb nu niet zoveel tijd .. maar hier even een voorbeeld waar een ouder meerdere kinderen in een array van pointers heeft staan (had ik nog van mijn opleiding):

Code:

#include <iostream.h>

//
// Containers? Testje..
//

class kind
{
public:
  kind() { leeftijd = 0; };
  kind(int L) { leeftijd = L; };
  int leeftijd;
};

typedef kind * pkind; // pkind is een pointer naar kind

class ouder
{
  pkind *pKindjes;
  int aantal;
public:
  ouder();
  ~ouder();
  void krijgkind(kind *K);
  kind& geefkind(int i);
};

ouder::ouder()
{
  // initialisatie
  aantal = 0;
}

ouder::~ouder()
{
  // opruimen
}

void ouder::krijgkind(kind *K)
{
  pkind *tmp;
  aantal++;
  tmp = new pkind[aantal];
  if(aantal > 1) {
    for(int i = 0; i < (aantal - 1); i++) {
      tmp[i] = pKindjes[i];
    }
  }
  tmp[aantal - 1] = K;

  pKindjes = tmp;

  cout << "add: [" << aantal - 1 << "] " << pKindjes[aantal - 1]->leeftijd << "\n";
}

kind& ouder::geefkind(int i)
{
  return *pKindjes[i];
}

int main()
{
  kind A(5);
  kind B(7);
  kind C(9);

  ouder O;
  O.krijgkind(&A);
  O.krijgkind(&B);
  O.krijgkind(&C);

  cout << "0 : " << O.geefkind(0).leeftijd << "\n";
  cout << "1 : " << O.geefkind(1).leeftijd << "\n";
  cout << "2 : " << O.geefkind(2).leeftijd << "\n";

  getchar();

  return 0;
}

Misschien heb je er iets aan .. ik ben weg hier :D kan zijn dat ik er morgen nog ff naar kijk :)

eddie 08-06-2002 16:45

Citaat:

******** schreef:
Ik heb nu niet zoveel tijd .. maar hier even een voorbeeld waar een ouder meerdere kinderen in een array van pointers heeft staan (had ik nog van mijn opleiding):

*code*

Misschien heb je er iets aan .. ik ben weg hier :D kan zijn dat ik er morgen nog ff naar kijk :)

En probeer nu eens de functie geefKind( int ) om te bouwen naar een array, als in:
Code:

O.kind[0].leeftijd;
Functie driven wil ik niet... Lijkt te veel op Java *brrrr* :D

Lethalis 09-06-2002 15:07

Dan zul je een containing-relatie moeten opbouwen en de [] operator moeten overloaden. Lees mijn samenvatting maar eens goed door :p

We gaan niet al het werk voor je doen :p

McMotion 09-06-2002 17:18

Citaat:

******** schreef:
Dan zul je een containing-relatie moeten opbouwen en de [] operator moeten overloaden. Lees mijn samenvatting maar eens goed door :p

We gaan niet al het werk voor je doen :p

idd via overloading... rechtstreeks pointers naar de objecten is niet echt aan te raden bij object georienteerd programmeren

Lethalis 09-06-2002 17:43

Citaat:

McMotion schreef:
rechtstreeks pointers naar de objecten is niet echt aan te raden bij object georienteerd programmeren
Nee, ik snap :o

Krijg je nogal een zooitje als een object out of scope gaat / ophoudt te bestaan. De pointers wijzen dan naar geheugenadressen die onderwijl misschien door andere objecten worden gebruikt. Idd niet zo slim van me :)

eddie 09-06-2002 19:35

Citaat:

******** schreef:
Dan zul je een containing-relatie moeten opbouwen en de [] operator moeten overloaden. Lees mijn samenvatting maar eens goed door :p

We gaan niet al het werk voor je doen :p

Ach ja... tuurlijk... overloading...

En je hoeft niet al het werk te doen... alleen even een voorbeeldje in elkaar frutselen ;)

Chimera 10-06-2002 10:19

Citaat:

eddie schreef:

En je hoeft niet al het werk te doen... alleen even een voorbeeldje in elkaar frutselen ;)

Nja. Koop een boek ;) De C++ Primer van Stroustroup (ofzo, de C++ 'uitvinder') is een aanrader.

Lethalis 10-06-2002 12:05

Citaat:

Chimera schreef:
Nja. Koop een boek ;) De C++ Primer van Stroustroup (ofzo, de C++ 'uitvinder') is een aanrader.
Waarschuwing: dit boek is erg dik :D *is in het bezit ervan* :)

Hieronder even een voorbeeld van operator overloading:

Code:

//
// Voorbeeld van operator overloading
//

#include <iostream.h>

#define MAX_AR 10

class voorbeeld
{
  int ar[MAX_AR]; // array van MAX_AR integers
public:
  voorbeeld(); // constructor
  int& operator [] (int i);
};

voorbeeld::voorbeeld()
{
  // Initialiseer alle elementen van de array op 0
  for(int i = 0; i < MAX_AR; i++) ar[i] = 0;
}

// Het overloaden van de [] operator
int& voorbeeld::operator [] (int i)
{
  return ar[i];
}

int main()
{
  voorbeeld Test;
  Test[0] = 1;
  Test[1] = 2;
  Test[2] = 3;

  cout << Test[0] << "\n";
  cout << Test[1] << "\n";
  cout << Test[2] << "\n";

  getchar();

  return 0;
}


Lethalis 10-06-2002 12:10

Je kunt nu trouwens een controle inbouwen op de parameter :) daarmee kun je memory overwrites voorkomen en dergelijke :)

eddie 10-06-2002 17:06

ik had zelf ook al iets geprobeerd met operator overloading...

Maar het werkte niet echt goed. Ik wou n.l. 2 (of meer) strings bij elkaar optellen... (a = "Blaat" + " whooie")

En ja, dat kan niet in C++... Dus die wou ik overloaden, maar... ik snapte het niet :o

In jou voorbeeld, waar word die overload toegepast?
Bij:
Test[0] = 1;

of bij
cout << Test[0];

Is imo wel belangrijk om te weten... :)

eddie 10-06-2002 17:09

Citaat:

******** schreef:
Waarschuwing: dit boek is erg dik :D *is in het bezit ervan* :)

Hoe dik?
Hoeveel A4 kantjes?

Ik heb nl AOA uitgeprint in de kast liggen, en dat zijn ongeveer 1536 A4 kantjes...

Lethalis 10-06-2002 17:15

Citaat:

eddie schreef:
Hoe dik?
Hoeveel A4 kantjes?

ff kijken ;)

..

1019 :)

eddie 10-06-2002 17:18

Citaat:

******** schreef:
ff kijken ;)

..

1019 :)

:cool:

ISB nummer? :)
*gaat hem misschien kopen* :D :D

Staat er ook in hoe je met Windows API's moet werken?

Lethalis 10-06-2002 17:20

Code:

class voorbeeld
{
public:
  int& operator [] (int i);
};

Hier maak ik bekend in het protocol van de klasse voorbeeld dat ik de [] operator overloaden wil. Het return-type is een simple reference naar een integer, hetgeen betekent dat ik de return-waarde van de functie direct manipuleren kan.

Code:

int& voorbeeld::operator [] (int i)
{
  return ar[i];
}

Dit is de definitie van de overloaded functie. Ik return een reference naar een integer in mijn array, waardoor deze beschikbaar wordt.

Code:

Test[0] = 1;
Test[0] geet mij een reference naar ar[0], welke ik met de assignment operator = een waarde van 1 toeken.

Code:

cout << Test[0] << "\n";
Test[0] geeft mij wederom ar[0], welke ik deze keer uitvoer :)

Veel valt er nu niet meer aan uit te leggen :D

eddie 10-06-2002 17:23

Citaat:

******** schreef:
<uitleg>

Veel valt er nu niet meer aan uit te leggen :D

Oohh...

Ik snap het! :)

Lethalis 10-06-2002 17:24

Citaat:

eddie schreef:
ISB nummer? :)
*gaat hem misschien kopen* :D :D

Euhm .. ff zoeken :D

Er staat achter op: ISBN 0-201-70073-5

Citaat:

Staat er ook in hoe je met Windows API's moet werken?
Nee.

De Windows API's staan los van C++. Hiervoor zul je een Win32API reference moeten zoeken, of MFC (Visual Studio / C++) of wel VCL/CLX (Borland Builder en Kylix), welke beide C++ wrappers voor de Win32API zijn, moeten leren.

Sterkte ;) :p

eddie 10-06-2002 21:26

Citaat:

******** schreef:
Euhm .. ff zoeken :D

Er staat achter op: ISBN 0-201-70073-5

:eek:

Wat duur...
Bol.com
Citaat:

******** schreef:

Nee.

De Windows API's staan los van C++. Hiervoor zul je een Win32API reference moeten zoeken, of MFC (Visual Studio / C++) of wel VCL/CLX (Borland Builder en Kylix), welke beide C++ wrappers voor de Win32API zijn, moeten leren.

Okee... ik kijk wel op msdn.microsoft.com/library :D
Citaat:

******** schreef:

Sterkte ;) :p

Dank! :D

McMotion 11-06-2002 17:38

Citaat:

******** schreef:
Code:

class voorbeeld
{
public:
  int& operator [] (int i);
};

Hier maak ik bekend in het protocol van de klasse voorbeeld dat ik de [] operator overloaden wil. Het return-type is een simple reference naar een integer, hetgeen betekent dat ik de return-waarde van de functie direct manipuleren kan.

dan geef je alsnog een pointer terug naar je data in het object zelf... okay noem het een reference variabel als je wil, maar het blijft hetzelfde :P

Lethalis 11-06-2002 17:44

Citaat:

McMotion schreef:
dan geef je alsnog een pointer terug naar je data in het object zelf... okay noem het een reference variabel als je wil, maar het blijft hetzelfde :P
Het is misschien lichtelijk in strijd met de data encapsulatie .. maar je kunt het ook overdrijven :p

McMotion 12-06-2002 09:47

jah maar dan kan je die ampersand toch ook gewoon weglaten, is nog minder tiepwerk ook! :D

Lethalis 12-06-2002 09:56

Citaat:

McMotion schreef:
jah maar dan kan je die ampersand toch ook gewoon weglaten, is nog minder tiepwerk ook! :D
Maar dan werken die assignments niet meer :) zou je dus een extra methode voor moeten schrijven..

eddie 12-06-2002 20:00

Waarom werkt dit niet?
In c zou "blub" moeten staan, maar op de derde posistie staat een "?" :confused:

Code

McMotion 14-06-2002 22:35

Citaat:

******** schreef:
Maar dan werken die assignments niet meer :) zou je dus een extra methode voor moeten schrijven..
idd.. ook weer overloaden :)
wat je allemaal wel niet over moet hebben voor data hiding! :D

McMotion 14-06-2002 22:37

maar wat ik niet begrijp eddie... waarom moet het op een array lijken :confused:
waarom niet gewoon een GetChild(int) functie?
da's veel logischer vind ik

eddie 15-06-2002 09:12

Citaat:

McMotion schreef:
maar wat ik niet begrijp eddie... waarom moet het op een array lijken :confused:
waarom niet gewoon een GetChild(int) functie?
da's veel logischer vind ik

Een array is mooier... :)

En zie mijn sig... :)

McMotion 15-06-2002 15:23

tja mooier is jouw mening maar het is geen goeie programmeerstijl... je moet er gewoon niet aan wennen bij OOP.. je moet het juist proberen te voorkomen!

eddie 18-06-2002 16:53

Citaat:

McMotion schreef:
tja mooier is jouw mening maar het is geen goeie programmeerstijl... je moet er gewoon niet aan wennen bij OOP.. je moet het juist proberen te voorkomen!
Maar hoe kan ik dat zorgen dat ik een array krijg (die ik dan kan benaderen via getObject() ofzo) dat uit verschillende objecten kan bestaan?

Lethalis 18-06-2002 19:04

Citaat:

eddie schreef:
Maar hoe kan ik dat zorgen dat ik een array krijg (die ik dan kan benaderen via getObject() ofzo) dat uit verschillende objecten kan bestaan?
Het is bij OOP niet de bedoeling dat je objecten direct benadert (versterkt namelijk de koppeling) :p

Een zwakke onderlinge koppeling tussen objecten en een sterke cohesie (gegevens en methoden horen bij elkaar per object) bevorderen de kwaliteit (onderhoudbaarheid) van programmatuur.

eddie 18-06-2002 19:17

Citaat:

******** schreef:
Het is bij OOP niet de bedoeling dat je objecten direct benadert (versterkt namelijk de koppeling) :p

Een zwakke onderlinge koppeling tussen objecten en een sterke cohesie (gegevens en methoden horen bij elkaar per object) bevorderen de kwaliteit (onderhoudbaarheid) van programmatuur.

huh :confused:

niet zulke 'moeilijke' woorden gebruiken svp, ik snap er niks van! :p :o

Lethalis 18-06-2002 19:26

Citaat:

eddie schreef:
niet zulke 'moeilijke' woorden gebruiken svp, ik snap er niks van! :p :o
Ach, ik herhaal ook alleen maar wat ik voor mijn examen weten moest ;) :D

Maar je kunt een GetObject functie toch gewoon een reference laten retourneren? Aan de andere kant is het beter om in de klasse zelf functie's te definieren die bewerkingen uitvoeren op de childs .. zo werkt je code alleen op die ene klasse, en niet direct met de childs. Dat bedoelde ik dus.

Dus niet:

MyObj->GetObject(x)->MyVal = y;
cout << MyObj->GetObject(x)->MyVal;

Maar:

MyObj->SetVal(x, y);
cout << MyObj->GetVal(x);

Bij wijze van .. het gaat om het principe van data hiding.

Lethalis 18-06-2002 19:32

Citaat:

******** schreef:
MyObj->GetObject(x)->MyVal = y;
cout << MyObj->GetObject(x)->MyVal;

MyObj->GetObject(x)->SetValue(y);
MyObj->GetObject(x)->GetValue();

Zou ook kunnen eigenlijk. Als je maar niet direct met de implementatie werkt.

eddie 18-06-2002 19:33

ja, ok.. boeie!

Maar hoe moet de functie GetObject eruit zien? Van welk type is x?


Volgens mij wil ik iets heeeeeel moeilijks, terwijl ik nog een ver-beginner ben... :o

Trouwens, Win2k gaat anders om met het geheugen dan Win98 :(

Nu werkt mijn mooie string-class niet meer :(

Lethalis 18-06-2002 19:47

http://home.wanadoo.nl/tsd-mas/dump/parentchild.cpp.txt

Een voorbeelde child / parent class .. deze keer met data hiding :)

eddie 18-06-2002 19:55

leuk, maar wat nou als je in plaats van één class 'cKind', twee classes, 'cJongen' en 'cMeisje' hebt?

Dat bedoel ik. Hoe los je dat op?

PS: Beide classes kunnen gebaseerd zijn op de class 'cKind'

Lethalis 18-06-2002 20:13

Citaat:

eddie schreef:
leuk, maar wat nou als je in plaats van één class 'cKind', twee classes, 'cJongen' en 'cMeisje' hebt?

Dat bedoel ik. Hoe los je dat op?

PS: Beide classes kunnen gebaseerd zijn op de class 'cKind'

Dat zou je op meerdere manieren kunnen doen.

Je kunt bijvoorbeeld de eigenschap Geslacht toevoegen aan de klasse cKind. Dat is het eenvoudigste..

eddie 18-06-2002 20:43

Citaat:

******** schreef:
Dat zou je op meerdere manieren kunnen doen.

Je kunt bijvoorbeeld de eigenschap Geslacht toevoegen aan de klasse cKind. Dat is het eenvoudigste..

Arrrrgh!!
Je wilt me niet snappen hè? :mad: ;)

Het gaat erom of het mogelijk is (en dat ik dan weet hoe het moet)

Lethalis 18-06-2002 20:45

Citaat:

eddie schreef:
Arrrrgh!!
Je wilt me niet snappen hè? :mad: ;)

;) :p

Citaat:

Het gaat erom of het mogelijk is (en dat ik dan weet hoe het moet)
Het is niet logisch en zinnig.

Maar in principe zou je dan met een base klasse werken .. het nadeel is dat extra eigenschappen verloren gaan, tenzij je met pointers werkt .. en dat wordt dus afgeraden..


Alle tijden zijn GMT +1. Het is nu 13:05.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.