05. september 1999 - 03:05Der er
9 kommentarer og 2 løsninger
overload af class constructor hvordan i praksis
eks..... class person{ public: char navn[64]; int age; person(char *fnavn, int alder); person(char *fnavn); }; person::person(char *fnavn, int alder) { strcpy(person::navn, fnavn); person::age = alder } person::person(char *fnavn) { int myage; strcpy(person::navn, fnavn); do { cout<<"Angiv din alder: "<<endl; cin>>myage; person::age=myage; }while(myage<=10) void main(void) { char fornavn[64]; int minalder = 0; cout<<"skriv dit navn: "<<endl; cin>>fornavn; cout<<"angiv din alder: "<endl; cin>> minalder; person nyperson(fornavn,minalder) //her virker det jo udemærket, men //hvordan for jeg den til at virke //hvis brugeren ikke taster sin alder //ind. jeg kan kade metoden sådan her person nypersonudenalder(fornavn) //men så har jeg jo to objekter af samme //person ??????? håber i kan se hvad //jeg mener } ps. Denne kode stump er ikke afprøvet Hilsen Simon
Hvis det er iorden at personen ikke indtaster alder, så er du nødt til at have to typer objekter eller også må du selv definere en default alder (jeg anbefaler det sidste).
Du kan f.eks. vælge en default alder til -1 år - det er jo ikke til at tage fejl af. Hvis du brugte pointere, så kunne du lade det være en NULL-pointer.
Overloading benyttes hvis man ønsker at kunne definere en variabel af SAMME type på to (eller flere) forskellige måder - f.eks. en person, sådan som du har beskrevet det ovenfor. Selvom bjarke's metode med at sætte en default-værdi på alder måske løser problemet i dit eksempel, er det ikke det man forstår ved oveloading.
Overloading er et spørgsmål om at have flere varianter af samme funktion (hvadenten den så er en constructor, eller blot en alm. funktion), hvor forskellen er typen og somme tider også antallet af parametre, f.eks.
int sum(int, int); float sum(float, float); double sum(double, double); double sum(double, ...); /* Uendeligt antal parametre, dog mindst een. */
Mht. constructoren, så lad mig give dig et kort eksempel: class tal { public: tal(); tal(int); tal(float); tal(char*); private: long cifre; long decimaler; } tal::tal() { cifre = 0; decimaler = 0; } tal::tal(int vaerdi) { cifre = vaerdi; decimaler = 0; } tal::tal(float vaerdi) { cifre = int(vaerdi); /* Seks decimalers præcision. */ decimaler = (vaerdi - cifre) * 100000; } tal::tal(char* vaerdi) { /* Udnyt allerede lavede/overloadede constructor. */ tal::tal(atof(vaerdi)); }
I forbindelse med overloading generelt, skal du være opmærksom på den auto-casting, som de fleste compilere selv laver. Hvis du f.eks. kalder en funktion som kræver en float som parameter med en variabel der er defineret som int, laver compileren selv en cast til typen float:
float minvaerdi(float v1, float v2); int envaerdi, enandenvaerdi, min; : min = minvaerdi(envaerdi, enandenvaerdi);
Dette ændrer compileren til
min = (int)minvaerdi((float)envaerdi, (float)enandenvaerdi);
for dig, hvis du IKKE overloader minvaerdi funktionen til f.eks.
float minvaerdi(float v1, float v2); int minvaerdi(int v1, int v2);
Overloading er specielt interessant til lige præcis dette, fordi flydende tal ikke er helt præcise. Du kan i overstående situation i princippet godt risikere at float versionen af funktionen returnerer noget andet end int versionen på de samme to tal, fordi de to værdier ikke kan repræsenteres helt korrekt som float. (1 bliver sommetider til 0.999999998E-1, 0 til 0.000000000009787E-23)
Overloading er grundigt beskrevet i Userguiden til f.eks. Turbo C++ 3.0. Jeg skal gerne kopiere og sende det til dig, hvis du er interesseret. (soepro@get2net.dk med adresse.)
Sådan! Lige mine ord;-) OK, jeg gik kun efter at løse det konkrete problem. I dette tilfælde ville jeg dog selv vælge min egen løsning, men det er vel i grunden mest et spørgsmål om smag og behag (altså i DETTE tilfælde, for overloading er jo et kanon redskab).
Hej Bjarke og Soepro, jeg ved ikke om i kører en kunkurence med hendsyn til point, men jeg synes faktisk at bege besvaringer var så gode at jeg ikke kunne tillade mig at afvise nogle af svarene. Tusind tak for det hilsen Simon
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.