Advertentie | |
|
![]() |
||
Verwijderd
|
Citaat:
![]() ![]() ![]() 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> ); Maak het svp niet tè moeilijk ![]() ![]() |
![]() |
||
Verwijderd
|
Citaat:
Ik was druk bezig met pointers en dynamissche geheugelallocaties (niet dat ik het kan ![]() ![]() |
![]() |
|
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]; }
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
||
Citaat:
ooops je wilde het toch statisch in arrays? dacht ik uit je voorgaande posts op te maken ![]()
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
||
Verwijderd
|
Citaat:
Dat je dus 'new' en 'delete' gebruikt om je subobjecten te maken en verwijderen. ![]() Toch bedankt voor je moeite! ![]() ![]() *heeft weer iets geleerd* Ik zal misschien later even de code posten die ik heb... ![]() |
![]() |
|
Verwijderd
|
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 ![]() |
![]() |
|
Verwijderd
|
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; } ![]() ![]() |
![]() |
||
Verwijderd
|
Citaat:
Code:
O.kind[0].leeftijd; ![]() |
![]() |
||
Citaat:
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
||
Verwijderd
|
Citaat:
![]() 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 ![]() |
![]() |
||
Verwijderd
|
Citaat:
En je hoeft niet al het werk te doen... alleen even een voorbeeldje in elkaar frutselen ![]() |
![]() |
||
Verwijderd
|
Citaat:
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; } |
![]() |
|
Verwijderd
|
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 ![]() In jou voorbeeld, waar word die overload toegepast? Bij: Test[0] = 1; of bij cout << Test[0]; Is imo wel belangrijk om te weten... ![]() |
![]() |
|
Verwijderd
|
Code:
class voorbeeld { public: int& operator [] (int i); }; Code:
int& voorbeeld::operator [] (int i) { return ar[i]; } Code:
Test[0] = 1; Code:
cout << Test[0] << "\n"; ![]() Veel valt er nu niet meer aan uit te leggen ![]() |
![]() |
|||
Verwijderd
|
Citaat:
![]() Er staat achter op: ISBN 0-201-70073-5 Citaat:
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 ![]() ![]() |
![]() |
||||
Verwijderd
|
Citaat:
![]() Wat duur... Bol.com Citaat:
![]() Citaat:
![]() |
![]() |
||
Citaat:
![]()
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
||
Verwijderd
|
Citaat:
![]() |
![]() |
||
Citaat:
![]() wat je allemaal wel niet over moet hebben voor data hiding! ![]()
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
|
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!
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
|
![]() |
||
Verwijderd
|
Citaat:
|
![]() |
||
Verwijderd
|
Citaat:
![]() Een zwakke onderlinge koppeling tussen objecten en een sterke cohesie (gegevens en methoden horen bij elkaar per object) bevorderen de kwaliteit (onderhoudbaarheid) van programmatuur. |
![]() |
||
Verwijderd
|
Citaat:
![]() niet zulke 'moeilijke' woorden gebruiken svp, ik snap er niks van! ![]() ![]() |
![]() |
||
Verwijderd
|
Citaat:
![]() ![]() 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. |
![]() |
|
Verwijderd
|
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... ![]() Trouwens, Win2k gaat anders om met het geheugen dan Win98 ![]() Nu werkt mijn mooie string-class niet meer ![]() Laatst gewijzigd op 18-06-2002 om 19:38. |
![]() |
|
Verwijderd
|
http://home.wanadoo.nl/tsd-mas/dump/parentchild.cpp.txt
Een voorbeelde child / parent class .. deze keer met data hiding ![]() |
![]() |
||
Verwijderd
|
Citaat:
Je kunt bijvoorbeeld de eigenschap Geslacht toevoegen aan de klasse cKind. Dat is het eenvoudigste.. |
![]() |
||
Verwijderd
|
Citaat:
Je wilt me niet snappen hè? ![]() ![]() Het gaat erom of het mogelijk is (en dat ik dan weet hoe het moet) |
![]() |
|||
Verwijderd
|
Citaat:
![]() ![]() Citaat:
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.. |
Advertentie |
|
![]() |
|
|
![]() |
||||
Forum | Topic | Reacties | Laatste bericht | |
Software & Hardware |
[C++] Abstracte klasses Jordi | 5 | 23-02-2007 12:37 | |
Software & Hardware |
[C++] class/struct type in een var opslaan deathz0rz | 10 | 21-02-2004 03:02 | |
Software & Hardware |
[C++Buider] Programma werkend krijgen lukt niet. langejongen | 5 | 24-12-2003 19:10 | |
Software & Hardware |
[C++] Class, probleempje(alweer;)) aldi - PUNK | 18 | 24-07-2003 15:33 | |
Software & Hardware |
[c++]classes aldi - PUNK | 7 | 19-05-2003 14:58 | |
Software & Hardware |
[C++] Classes variable Talon | 5 | 27-04-2003 19:01 |