Avatar billede shjtip Nybegynder
05. september 1999 - 03:05 Der 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


}
Avatar billede 127144146281 Nybegynder
05. september 1999 - 11:35 #1
hvorfor laver du så ikke bare en default alder
Avatar billede bjarke Nybegynder
06. september 1999 - 18:50 #2
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.

Nå men løsningen kan være så simpel som:

person::person(char *fnavn, int alder=-1)
    {
    strcpy(person::navn, fnavn);
    person::age = alder
    }

Hvis der kun er et argument (det første), så bliver alderen sat til -1. Dvs at du kan bruge den samme konstruktor med både en og to parametre:-)

/Bjarke
Avatar billede bjarke Nybegynder
06. september 1999 - 18:51 #3
Hovsa - jeg glemmer det altid, men ovenstående er altså et svar;-)

/Bjarke
Avatar billede bjarke Nybegynder
06. september 1999 - 18:58 #4
I dit program kan man i øvrigt ikke undlade at indtaste sin alder. Programmet vil prompte indtil der indtastes en værdi.

Det kan løses på følgende måde:

cin.unsetf(ios::skipws);      // "blanke" tegn (<SPACE>, <RETURN> mm) skippes ikke
cin >> i;
if( cin.good() )
Avatar billede bjarke Nybegynder
06. september 1999 - 19:00 #5
arrghh - man kan ikke bruge tabulator, så jeg fortsætter her hvor jeg slap:
  {
  // no error
  }
// error

Tænk dig til resten - eller spørg;-)

/Bjarke
Avatar billede soepro Nybegynder
07. september 1999 - 11:06 #6
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.)
Avatar billede bjarke Nybegynder
07. september 1999 - 11:17 #7
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).
Avatar billede soepro Nybegynder
07. september 1999 - 14:02 #8
Se evt. også spørgsmålet "oprette et array af et objekt", som lidt handler om det samme.
Avatar billede shjtip Nybegynder
08. september 1999 - 23:29 #9
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
Avatar billede shjtip Nybegynder
08. september 1999 - 23:31 #10
hva er det dog jeg laver, det er altså ikke fordi jeg ikke kan stave, men det her er da helt rundt på gulvet :-)
Avatar billede bjarke Nybegynder
09. september 1999 - 09:00 #11
Velbekomme - lidt sport er der vel altid i det;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester