Mam jeszcze jedno pytanie. Napiszę tutaj, bo nie chcę specjalnie tworzyć nowego tematu.
Chciałem napisać prosty program z klasą, w której będą dwa konstruktory przeciążone, abym podczas tworzenia obiektu klasy miał wybór, czy chcę podawać wartości do pól, czy zostawić je z wartością domyślną. Napisałem taki program:
#include <iostream>
#include <string>
#include <cctype>
#include <windows.h>
using namespace std;
class Osoba
{
private:
string imie;
int wiek;
int wzrost;
public:
Osoba() //konstruktor domyslny
{
imie="brak";
wiek=0;
wzrost=0;
}
Osoba(string imie="brak", int wiek=0, int wzrost=0) //konstruktor wieloargumentowy
{
this->imie=imie;
this->wiek=wiek;
this->wzrost=wzrost;
}
void wyswietl()
{
cout<<"Dane"<<endl;
cout<<"Imie: "<<imie<<endl;
cout<<"Wiek: "<<wiek<<endl;
cout<<"Wzrost: "<<wzrost<<endl<<endl;
}
void podaj()
{
cout<<"Podaj dane"<<endl;
cout<<"Podaj imie: ";
getline(cin, imie);
cout<<"Podaj wiek: ";
cin>>wiek;
cout<<"Podaj wzrost: ";
cin>>wzrost;
}
void pobierz(string imie, int wiek, int wzrost)
{
this->imie=imie;
this->wiek=wiek;
this->wzrost=wzrost;
}
};
int main()
{
Osoba Karol; //blad kompilacji
//Karol.podaj();
//Karol.pobierz("xyz",9,8);
Karol.wyswietl();
return 0;
}
Podczas kompilacji pojawia się błąd w zaznaczonej przeze mnie linijce z nst. komunikatem: "error: call of overloaded 'Osoba()' is ambiguous". Potem z poniższej linii:
Osoba(string imie="brak", int wiek=0, int wzrost=0) //konstruktor wieloargumentowy
Usunąłem podane domyślne wartości argumentów i program zadziałał. W komunikacie o błędzie pojawia się słowo overloaded, czyli mam rozumieć, że dochodzi do jakiegoś "przeładowania" podczas kompilacji, bo zarówno w konstruktorze domyślnym, jak i wieloargumentowym zostały podane wartości początkowe? Czyli tak nie można robić?