Ecco il rettangolo di cui sopra:
#include<stdio.h> class Rettangolo{ int base, altezza; public: void setValues(int b, int a); int area(); }; void Rettangolo::setValues(int b, int a){ base=b; altezza=a; } int Rettangolo::area(){ return(base*altezza); } void main(){ Rettangolo MioRettangolo; MioRettangolo.setValues(3,5); printf("%u",MioRettangolo.area()); getc(stdin); }...in cui prima di stampare a video l'area, valore restituito dal metodo area(), bisogna chiamare esplicitamente il metodo setValues(int,int) che dia un valore ai membri dato base e altezza.
Se non si chiama prima il metodo setValues(int,int) il metodo area() non può dare alcun risultato.
Anzichè chiamare esplicitamente il metodo setValues(int,int) dispongo un metodo che viene chiamato automaticamente al momento dell'istanziazione della classe, ossia il costruttore:
#include<stdio.h>
class Rettangolo{
int base, altezza;
public:
Rettangolo(int,int);
int area();
};
Rettangolo::Rettangolo(int b, int a){
base=b;
altezza=a;
}
int Rettangolo::area(){
return(base*altezza);
}
void main(){
Rettangolo MioRettangolo;
printf("%u",MioRettangolo.area());
getc(stdin);
}
Ottengo un errore!Perchè?
Il messaggio di errore è nessun costruttore predefinito
Ah, già! Ricordo che è assolutamente necessario che ci sia un costruttore predefinito per ogni classe! Questo costruttore deve essere privo di parametri.
Ovviamo!
#include<stdio.h> class Rettangolo{ int base, altezza; public: Rettangolo(); int area(); }; Rettangolo::Rettangolo(){ base=5; altezza=3; } int Rettangolo::area(){ return(base*altezza); } void main(){ Rettangolo MioRettangolo; printf("%u",MioRettangolo.area()); getc(stdin); }Ecco: il costruttore senza parametri mi viene accettato. Nel suo contesto posso inserire i valori da dare ai membri dato all'atto dell'istanziazione o anche lasciarlo vuoto.
Se non vi è altro costruttore, esso può essere anche omesso, ma se vi è un altro costruttore esso deve essere dichiarato esplicitamente, anche privo di codice.
In pratica, ogni inserimento di costruttore differente da quello predefinito deve essere inteso come un overloading del costruttore!
Nessun commento:
Posta un commento