Problem z konstruktorem

0

Witam, mam pewien problem jeśli chodzi o konstruktor domniemany.
Mam taki kod (oczywiście, to tylko wycinek):

#include <iostream.h>
#include <string.h>

const int pojemnoscKolekcji = 10 ;

//////////////////////////////////////////////////////////////
class Osoba
{
	char imie[20],
		 nazwisko[30] ;

public :
	Osoba(char *im, char *nazw)
	{
		strcpy(imie, im) ;
		strcpy(nazwisko, nazw) ;
	}
	//Osoba() {}		// jeśli widzi taką linijkę - kompiluję poprawnie

	friend ostream & operator<<(ostream &strumien, Osoba &obiekt) ;
} ;
//////////////////////////////////////////////////////////////
class Kolekcja		// ta klasa ma za zadanie kolekjonować obiekty klasy Osoba
{
	Osoba tablica[pojemnoscKolekcji] ;
	int licznikObiektow ;

public :
	Kolekcja() : licznikObiektow(0)
	{
	}        // (1) - tu kompilator wskazuje błąd

	int dodaj(Osoba *obiekt, int pozycja = -1) ;	// dodawanie elementu
	int usun(int pozycja) ;		// usuwanie elementu
	int zsun(int pozycja) ;		// zsuniecie obiektow tablicy czyli usuwanie wolnego miejsca 
	int rozsun(int pozycja) ;	// rozsuniecie obiektow tablicy czyli zrobienie wolnego
								// miejsca
	Osoba coNaPozycji(int pozycja) ;	// sprawdzenie co jest na danej pozycji w tablicy
	
	friend ostream & operator<<(ostream &strumien, Kolekcja &obiekt) ;
} ;
///////////////////////////////////////////////////////////////

/**************************************************************/
/************** definicje funkcji skladowych klasy Kolekcja****/
/**************************************************************/

int Kolekcja::dodaj(Osoba *obiekt, int pozycja)
{
	if(pozycja < 0 || pozycja > pojemnoscKolekcji )
	{
		pozycja = licznikObiektow ;
	}
    
	if(licznikObiektow == pozycja)
	{
		cout << "Kolekcja ma maksymalną liczbę obiektow" << endl ;
	}

	rozsun(pozycja) ;
	tablica[pozycja] = *obiekt ;		
	licznikObiektow++ ;
	return 0 ;
}
/**************************************************************/

Dlaczego kompilator wypisuje mi błąd "no appropriate default constructor available" (VC++ 6.0) ? Przecież, jeśli w klasie jest zdefiniowany jeden, jedyny konstruktor to on staje się konstruktorem domniemanym. Domniemanym - bo innego nie ma :-) Swoją drogą, błąd, niewiedzieć czemu, wyskakuje mi tutaj (1). Czemu tak się dzieje ? Proszę o pomoc.

0

Witam!
Problem nie leży w klasie Kolekcja tylko Osoba. Aby utworzyć tablicę

Osoba tablica[pojemnoscKolekcji] ;

klasa Osoba musia posiadać konstruktor domyślny. A ponieważ go nie ma to wywala błąd. Więc wystarczy, że odkomentujesz

//Osoba() {} //

i jak sam zauważyłeś będzie działać.

0

Właściwie, to nie mogę powiedzieć żebyś nie miał racji :-) Jednakże, dziwię się dlaczego tak jest. Zdawało mi się logiczne, że skoro w klasie jest jeden konstruktor to on jest domyślny. No ale :-)

0

Z definicji konstruktor domyślny to ten bezargumentowy . Jak piszesz coś takiego :
Klasa obiekt;
to w klasie musi być konstruktor bezargumentowy , taki zapis jest wyjątkiem od reguły , bo niby powinno się napisać tak :
Klasa obiekt();
jednak twórcy języka ułatwili nam sprawe i pomimo tego , że konstruktor jest funkcją to nie trzeba w tym przypadku pisać nawiasów .
Ty miałeś taką sytuacje :
Klasa obiekt[cośtam];
czyli tworzysz tablice obiektów z konstruktora domyślnego , bo nie widze tam żadnych argumentów , a masz w klasie zadeklarowany tylko konstruktor z argumentami , więc program skąd ma wiedzieć jakie argumenty ma przesłać do konstruktora ?? Tak jakbyś chciał wywołąć funkcje dwuargumentową bez żadnych argumentów . Wtedy kompilator powiedziałby , że nie ma takiej funkcji , tak samo tutaj w twoim przypadku nie było konstruktora bezargumentowego , który wywoływałeś .

0

Czyli znaczy to, że gdybym chciał wywołać mój konstruktor to powinienem napisać Osoba tablica("Mis", "Uszatek")[pojemnoscKolekcji] ; tak ? Czy powyższy zapis jest w ogóle dopuszczalny ? Dopisane : Poza tym, jeśli programista nie zdefiniuje konstruktora domniemanego to kompilator przecież sam go wytworzy, czyż nie ? Zaczynam się czasem w tym wszystkim gubić. A powyższy zapis jest głupi bo przecież nie chodzi tu o to aby stworzyć tablicę obiektow "Mis Uszatek" ;-)

0

Poza tym, jeśli programista nie zdefiniuje konstruktora domniemanego to kompilator przecież sam go wytworzy, czyż nie ?

C++ Dla Każdego :

"Gdy potrzebujesz konstruktora nie posiadającego parametrów i stworzysz jakikolwiek inny konstruktor , musisz stworzyć także konstruktor domyślny! "

Gdy stworzysz jakikolwiek konstruktor , kompilator nie dostarcza już konstruktora domyślnego , jeśli nie stworzysz żadnego kompilator tworzy taki który nic nie robi ( domyślny )...

0
</quote> Gdy stworzysz jakikolwiek konstruktor , kompilator nie dostarcza już konstruktora domyślnego , jeśli nie stworzysz żadnego kompilator tworzy taki który nic nie robi ( domyślny )...</quote> Masz rację. Ale zauważ, że po odkomentowaniu linijki Osoba() {} kod się poprawnie kompiluje. A to przecież jest konstruktor domyślny, który, jak sam napisałeś, powinien stworzyć kompilator ...
0

A to przecież jest konstruktor domyślny, który, jak sam napisałeś, powinien stworzyć kompilator ...

Napisałem , że by go stworzył gdybyś nie miał innego , a ty taki masz ;)
[browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1