Bnet pindle#2913
maar je mag de elementen niet direct aanspreken zoals bij een struct maar dit dient via functies die in de adt gedeclareerd zijn te gebeuren
Doet iets met Cloud (MS/IBM)
Huh? Jij hebt het hier over een 'class'. Dat kan je natuurlijk ook als een abstract data type beschouwen, maar ik denk dat porn hier eigenlijk wou zeggen wat is een 'abstracte class'. En dat is een class waarvan je geen instances kunt definieren. je moet eerst een class afleiden van die AC en daarvan dan variablen van declareren.Op zondag 17 juni 2001 22:09 schreef D2k het volgende:
een adt in c++ is een soort struct als in c
maar je mag de elementen niet direct aanspreken zoals bij een struct maar dit dient via functies die in de adt gedeclareerd zijn te gebeuren
https://fgheysels.github.io/
Wat is daar dan precies het nut van? Als ik alleen die klasse definieer kan ik hem direct gebruiken, waar is dan de 'blueprint' voor nodig?
Edit:
Hou je mond aapErg dom van je porn
Alsof jij het me kan vertellen HAHA!
Bnet pindle#2913
A Breakbeat A Day Keeps Religion Away.
Een ADT (Abstract Data Type) is een zelf gedefinieerd datatype. Als de specificatie van het ADT bekend is kun je dit type op dezelfde wijze gebruiken als de ingebouwde typen van C++ (zoals char, int en double).
Een adt koppelt een bepaalde datastructuur (interne variabelen) met de bij deze datasctructuur behorende bewerkingen(functies).
Doet iets met Cloud (MS/IBM)
In C++ kunnen ADT's geimplementeerd worden dmv templates. Het standaard voorbeeld is een swap functie:
1
2
3
4
5
| void swap(int &a, int &b) { int tmp = b; b = a; a = tmp; } |
Bovenstaande is een specifieke implementatie van een swap functie, die alleen met integers werkt. Als je nu bijv. ook een swap functie voor longs, doubles, floats etc. wil maken moet je voor elk type een aparte functie schrijven.
Met templates is dit niet meer nodig. Bijv:
1
2
3
4
5
6
7
| template <class swapT> void swap(swapT a, swapT b) { swapT tmp = b; b = a; a = tmp; } |
Dit abstracte template werkt nu met elk datatype:
int a = 1; int b = 2; swap(a,b);
float c = 0.5; float d = 0.7; swap(c,d);
etc.
Stel je maakt een tekenprogje.
Je maakt dan een ADT figuur met een functie <Draw>.
Deze functie weet nog niet hoe hij zichzelf moet tekenen immers hij weet nog niet WAT voor figuur hij is. Je weet echter op moment dat je figuur tekend al wel dat alle figuren zichzelf MOETEN kunnen tekenen en dus ook een <Draw> functie MOETEN implementeren.
Door nu dus de klasse cirkel te laten erfen van de ADT figuur dwing je hem om een <Draw> functie te maken.
In dit voorbeeld is het natuurlijk vrij duidelijk dat ieder figuur een <Draw> functie moet hebben. maar het is maar een voorbeeld.
khoop dat ik weer niet eens uit mijn nek heb lopen brallen en dat je er wat aan hebt.
Iemand doodmaken met een blije mus.....
daar ben ik het niet helemaal mee een. in een adt _kan_ je templates gebruikenOp zondag 17 juni 2001 22:49 schreef darthdrinker het volgende:
<knip met schaar>
maar een adt hoeft geen template te hebben
Doet iets met Cloud (MS/IBM)
Dus ook met een abstract datatype!Op zondag 17 juni 2001 22:47 schreef TlighT het volgende:
[..]
Dit abstracte template werkt nu met elk datatype:
[..]
Overigens vind ik 'abstracte template' geen goede benaming. Het is gewoon een template..
Dat zei'k toch?Op zondag 17 juni 2001 22:55 schreef D2k het volgende:
[..]
daar ben ik het niet helemaal mee een. in een adt _kan_ je templates gebruiken
maar een adt hoeft geen template te hebben
Ok, niet duidelijk genoeg kennelijk...Op zondag 17 juni 2001 22:47 schreef TlighT het volgende:
In C++ kunnen ADT's geimplementeerd worden dmv templates.
zoals jij het bracht werd het er niet duidelijker op iigOp zondag 17 juni 2001 22:59 schreef TlighT het volgende:
[..]
Dat zei'k toch?
[..]
Doet iets met Cloud (MS/IBM)
Ik bedoel: voor die swapfunctie is het inderdaad handiger dan voor alle verschillende typen een andere klasse te maken, maar ook dat is niet moeilijk: daar is copy-paste voor
Wordt het in de praktijk ook veel toegepast?
Bnet pindle#2913
Je kan dan voor al deze figuren draw annroepen zonder dat je hoeft te weten wat voor soort figuur het is.
Iemand doodmaken met een blije mus.....
Ja, want als het programma uitgebreid wordt met een nieuw datatype bijvoorbeeld, waarop ook die swap-functie word aangeroepen, dan hoef jij niet te copy-pasten. Dat doet de compiler. Gemak dient de mens...Op zondag 17 juni 2001 23:04 schreef porn het volgende:
Ik bedoel: voor die swapfunctie is het inderdaad handiger dan voor alle verschillende typen een andere klasse te maken, maar ook dat is niet moeilijk: daar is copy-paste voor
Wordt het in de praktijk ook veel toegepast?
Maar dit gaat meer over een template dan over een ADT.
Of als je iets wilt wijzigen in die functie hoef je maar 1 functie te wijzigen.Op zondag 17 juni 2001 23:10 schreef RdeTuinman het volgende:
[..]
Ja, want als het programma uitgebreid wordt met een nieuw datatype bijvoorbeeld, waarop ook die swap-functie word aangeroepen, dan hoef jij niet te copy-pasten. Dat doet de compiler. Gemak dient de mens...
Maar dit gaat meer over een template dan over een ADT.
Templates kan je trouwens ook voor klasses gebruiken.
https://fgheysels.github.io/
Een voorbeeld hiervan is bijvoorbeeld een Vector. Deze kunnen in de wiskunde opgeteld en afgetroken worden enzo. Om dit te regelen in een programmeertaal kan je een abstract data type introduceren. Deze bevat bijv twee elementen, de hoek en de lengte. Deze kan je alleen aan de buitenkant niet zien. Wat je wel kan is die 2 vector types optellen met bijv een apparte fuctie Add() die dan de mbv de hoek en graden de uitkomst uitrekent.
Je kan het voorstellen als een soort van abstractie laag over gegevens. De echte uitvoering wordt verborgen onder een laag waar mee makelijker te werken is.
Ik hoop dat het zo duidelijk is.
Ooh ja, bron: school
"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."
Verwijderd
Grofgezegd is een "fully encapsulated" class dus een ADT; data in zo'n class mag alleen dmv. methodes van die class (het interface) benaderd worden.An abstract data type (ADT) is characterized by the following properties:
1. It exports a type.
2. It exports a set of operations. This set is called interface.
3. Operations of the interface are the one and only access mechanism to the type's data structure.
4. Axioms and preconditions define the application domain of the type.
wow. wat GOED van jullieOp zondag 17 juni 2001 22:36 schreef D2k het volgende:
posting van D2k en Rob de tuinman samen(beiden een 9 voor hun tentamen C++)
nope
Volgens mij klopt dit totaal niet: een abstracte class is simpelweg een klasse met viruele lidfuncties, dus functies die zijn gedeclareerd, maar nog niet gedefinieerd. Een ADT kan dus niet gebruikt worden.Op maandag 18 juni 2001 19:34 schreef mietje het volgende:
Grofgezegd is een "fully encapsulated" class dus een ADT; data in zo'n class mag alleen dmv. methodes van die class (het interface) benaderd worden.
Een ADT specificeert welke functies door afgeleide klassen geimplementeert moeten worden, zodat verschillende klassen met dezelfde 'ouder' op gelijke wijze behaldeld kunnen worden (zoals darthdrinker uitlegt in zijn voorbeeld.)
Om het nog duidelijker te maken:
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
39
40
41
42
43
| class CFiguur { ... public: virtual void Draw() = 0; ... }; class CVierkant: public CFiguur { ... public: void Draw(); ... } class CRondje: public CFiguur { ... public: void Draw(); ... } void CVierkant::Draw() { // teken het vierkant } void CRondje::Draw() { // teken het rondje } CFiguur *figuren[100]; ... figuren[0] = new CVierkant(); figuren[1] = new CRondje(); figuren[0]->Draw(); // de verschillende klassen kunnen op figuren[1]->Draw(); // dezelfde manier benaderd worden |
Vonden we zelf ook wel ja. 't Is maar ff dat je het weet.Op maandag 18 juni 2001 20:11 schreef bloody het volgende:
wow. wat GOED van jullie![]()
Ondanks die 9 geven jullie niet echt een goede definitie:Op maandag 18 juni 2001 21:53 schreef RdeTuinman het volgende:
[..]
Vonden we zelf ook wel ja. 't Is maar ff dat je het weet.
Een ADT (Abstract Data Type) is een zelf gedefinieerd datatype. Als de specificatie van het ADT bekend is kun je dit type op dezelfde wijze gebruiken als de ingebouwde typen van C++ (zoals char, int en double).
Een adt koppelt een bepaalde datastructuur (interne variabelen) met de bij deze datasctructuur behorende bewerkingen(functies).
OK, jij zegt het. Gelukkig werd het ook niet gevraagd op het tentamen.Op maandag 18 juni 2001 21:58 schreef marcusk het volgende:
Ondanks die 9 geven jullie niet echt een goede definitie:
wel hè?Op maandag 18 juni 2001 20:11 schreef bloody het volgende:
[..]
wow. wat GOED van jullie![]()
Doet iets met Cloud (MS/IBM)
Heb ik toch al gedaan :Op maandag 18 juni 2001 22:55 schreef D2k het volgende:
[..]
geef eens een betere dan
een abstracte class is simpelweg een klasse met viruele lidfuncties, dus functies die zijn gedeclareerd, maar nog niet gedefinieerd.
Verwijderd
Geloof me dat het wel klopt. Wat jij beschrijft is een (pure) virtual base class. ADTs hebben niets met inheritance te maken. Een ADT is gewoon een encapsulated datatype, een VBC specificeert een virtueel interface.Op maandag 18 juni 2001 21:09 schreef marcusk het volgende:
Volgens mij klopt dit totaal niet: een abstracte class is simpelweg een klasse met viruele lidfuncties, dus functies die zijn gedeclareerd, maar nog niet gedefinieerd. Een ADT kan dus niet gebruikt worden.
Ik geloof het nietOp maandag 18 juni 2001 23:18 schreef mietje het volgende:
Geloof me dat het wel klopt.
Aangezien het hier om een definitie gaat en er dus niet zo veel te discussieren valt heb ik het maar ff ingetypt in av. Het eerste wat ik tegenkwam was dit:
(http://www.sics.se/isl/quintus/objects/glossary.html)abstract class
A class that cannot have instances. Abstract classes are helpful in designing a class hierarchy, to contain the common parts of several concrete classes.
Verwijderd
Zie deze link voor letterlijk mijn definitie van een ADT: http://www.zib.de/Visual/people/mueller/Course/Tutorial/node4.html
Eindelijk, Jij was volgens mij de eerste correcte en volledige beschrijving van een abstract datatype.Op maandag 18 juni 2001 19:19 schreef drZymo het volgende:
Abstracte Data Types zijn type definities waarvan de waarden uitsluitend gemanipuleerd mogen worden door middel van een vast collectie bijgeleverde procedures.[blablabla]
Simplistisch:
Het idee achter een abstract datatype is dat je niet weet HOE de datatype zelf intern is opgebouwd (dat is immers het abstracte), Je kan het alleen aanspreken via de "functies" die worden geleverd.
Als je bijvoorbeeld een abstracte datatype QUEUE hebt. Maakt het jou niet uit HOE de queue wordt opgeslagen. Zolang je het maar kunt gebruiken. Of het datatype nou werkelijk een linked list, double linked list of een simpele array is maakt voor het gebruik niet uit en is daarom ook niet belangrijk.
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
Hmm... het lijkt erop dat je toch gelijk hebtOp maandag 18 juni 2001 23:31 schreef mietje het volgende:
marcusk>> een abstract class is niet het zelfde als een abstract datatype! Juist om deze verwarring te voorkomen noemt men in C++ een abstract class een pure virtual base class.
Zie deze link voor letterlijk mijn definitie van een ADT: http://www.zib.de/Visual/people/mueller/Course/Tutorial/node4.html
Dit kende ik als het 'black box' principe.Op maandag 18 juni 2001 23:44 schreef dusty het volgende:
[..]
Eindelijk, Jij was volgens mij de eerste correcte en volledige beschrijving van een abstract datatype.
Simplistisch:
Het idee achter een abstract datatype is dat je niet weet HOE de datatype zelf intern is opgebouwd (dat is immers het abstracte), Je kan het alleen aanspreken via de "functies" die worden geleverd.
Als je bijvoorbeeld een abstracte datatype QUEUE hebt. Maakt het jou niet uit HOE de queue wordt opgeslagen. Zolang je het maar kunt gebruiken. Of het datatype nou werkelijk een linked list, double linked list of een simpele array is maakt voor het gebruik niet uit en is daarom ook niet belangrijk.
"Black Box" principe wordt in principe alleen gebruikt bij het testen van routines.Op maandag 18 juni 2001 23:50 schreef marcusk het volgende:
Dit kende ik als het 'black box' principe.
Je krijgt de parameters, de pre en post condities en vandaaruit ga je kijken of een functie doet wat het hoort te doen.
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
- Wat is _exact_ de betekenis van 'abstract' hier?
Eem int is een concreet datatype, toch?
- Is een array van int's een abtract datatype?
- Is een struct met daarin wat int's een abstract datatype?
- Is een class met daarin wat int's, zonder memberfuncties een abstract datatype?
Mijn conclusie: Alle datatypes die niet ingebouwd zijn in de taal, zijn abstracte datatypes. Dus _alle_ user defined datatypes, ook die zonder 'bijbehorende' functies.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Verwijderd
Een voorbeeldje: we hebben een class Coordinaat die er zo uit ziet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Coordinaat { public: // foute boel, moet private double a, b; public: void verplaats_cartesisch(double x, double y); void verplaats_polair(double afstand, double hoek); double x() const; double y() const; double afstand() const; double hoek() const; // en nog een heleboel methods... }; |
Die primitieven a en b zijn nu zichtbaar voor de gebruiker van de class. Hij kan a en b rechtstreeks lezen en schrijven, maar wat leest/schrijft hij dan, cartesische of pool coordinaten? Hoe heeft die vorige programmeur de class geimplementeerd, en zal dat in de toekomst zo blijven?
Als we de primitieven private maken zijn ze onzichtbaar voor de gebruiker van de class, hij kan enkel de methods gebruiken en hoeft zich niet druk te maken of Coordinaat cartesisch dan wel polair geimplementeerd is. Hij zal z'n code ook niet hoeven wijzigen als dat ooit verandert, simpelweg recompilen is voldoende.
Daarom moet dus in een ADT alle data encapsulated zijn. Abstract slaat dus op het feit dat je als gebruiker de implementatie van de classes niet boeit, je gebruikt simpelweg de eenduidige methods die je verstrekt zijn.
<edit>zin liep niet</edit>
Abstract betekent hier dat je de opbouw van de datatype NIET weet. Je weet alleen de methodes die je kan gebruiken om waarden in de datatype te krijgen.Op dinsdag 19 juni 2001 01:02 schreef farlane het volgende:
Het is me niet geheel duidelijk....
- Wat is _exact_ de betekenis van 'abstract' hier?
Eem int is een concreet datatype, toch?
- Is een array van int's een abtract datatype?
- Is een struct met daarin wat int's een abstract datatype?
- Is een class met daarin wat int's, zonder memberfuncties een abstract datatype?
Mijn conclusie: Alle datatypes die niet ingebouwd zijn in de taal, zijn abstracte datatypes. Dus _alle_ user defined datatypes, ook die zonder 'bijbehorende' functies.
Zoals in mijn voorbeeld als je een ADT queue hebt kan je methoden :
Voegtoeaanqueue(waarde),
Haaluitqueue(waarde)
hebben. Hoe die queue intern werkt weet je niet omdat dat "afgeschermd" is. Wilt de programmeur van de ADT het op een andere methode oplossen dan kan hij dat gewoon doen door de ADT te herschrijven zolang hij de pre/post condities van de methoden hetzelfde laat is er voor het programma niets aan de hand, Hercompileren en het zou gewoon moeten werken.
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
Zolang de programmeur de pre-/post condities hetzelfde laat natuurlijk. (toch wel redelijk belangrijk om dat OOK te vermelden.)Op dinsdag 19 juni 2001 02:11 schreef mietje het volgende:
Als we de primitieven private maken zijn ze onzichtbaar voor de gebruiker van de class, hij kan enkel de methods gebruiken en hoeft zich niet druk te maken of Coordinaat cartesisch dan wel polair geimplementeerd is. Hij zal z'n code ook niet hoeven wijzigen als dat ooit verandert, simpelweg recompilen is voldoende.
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
Zoals ik dus allang heb proberen uit te leggen.Op maandag 18 juni 2001 23:44 schreef dusty het volgende:
[..]
Eindelijk, Jij was volgens mij de eerste correcte en volledige beschrijving van een abstract datatype.
Simplistisch:
Het idee achter een abstract datatype is dat je niet weet HOE de datatype zelf intern is opgebouwd (dat is immers het abstracte), Je kan het alleen aanspreken via de "functies" die worden geleverd.
Als je bijvoorbeeld een abstracte datatype QUEUE hebt. Maakt het jou niet uit HOE de queue wordt opgeslagen. Zolang je het maar kunt gebruiken. Of het datatype nou werkelijk een linked list, double linked list of een simpele array is maakt voor het gebruik niet uit en is daarom ook niet belangrijk.
"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."
En daarom dacht ik van: laat ik het eens zo simpel mogelijk beschrijven, misschien lukt het dan welOp dinsdag 19 juni 2001 10:20 schreef drZymo het volgende:
Zoals ik dus allang heb proberen uit te leggen.
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
Niet dat de rest per sé fout is: er bestaat veel verwarring op dat gebied, maar Dusty's omschrijving klopt zo ongeveer wel.
Bnet pindle#2913
Verwijderd
Geef je de exacte, formele definitie van een ADT, "zit de omschrijving van dusty meer in de buurt"...
Some people are right, even when they're wrong.