Nie moge odwołać sie do funkcji w klasie

0

Witam ,
od pewnego czasu kontynuuje swoją przygodę z C++ , ale natknąłem się na przeszkodę.

#include<stdio.h>
#include<string.h>
#include<time.h>

#define GMT (+2)
class zegarek{
	private:
		int godz,
			min;
			
		char   dzien[20];
	public:
		void  pokaz_czas(){
			printf("teraz mamy godzine %d:%d ",godz,min);
			printf(" w dniu %s",dzien);
		};

		zegarek(int ,int ,char *) ;//konstruktor
		~zegarek(){
			printf("\nsprzatam po sobie, nara!");//destruktor
		}

};
zegarek::zegarek(int a,int b,char * c)
{ 
	
	
	godz=a ; 
	min=b ; 
	strcpy(dzien , c) ;
	};
main()
{
	time_t czas; 
	struct tm * ptm;
	
	time(&czas);
	ptm= gmtime(&czas);
	zegarek *moj ,&m =*moj;

	//zegarek moj(ptm->tm_hour+GMT,ptm->tm_min, "wtorek\0"); 1. próba

	moj=new zegarek(ptm->tm_hour+GMT,ptm->tm_min,"wtorek\0"); //2. próba

	m.pokaz_czas();


}

Jak widać wyżej mamy klasę o nazwie zegarek i w na niej ćwiczę konstruktory(w oparciu o książkę "Symfonia C++").Pierwsza próba udaje się , ale właśnie z próbą drugą jest kłopot a mianowicie z odwołaniem się do funkcji.Po użyciu operatora *new próbuję wywołać funkcję *pokaz_czas() .Kompilacja się udaję(wywala tylko ostrzeżenie o deprecated conversion) i kiedy uruchamiam program to wyskakuje okienko o błędzie.Proszę o wskazówki dotyczące mojej pomyłki.

1

WTF? Ty chyba tylko kartkujesz tą książkę zamiast czytać. To co zrobiłeś to jakaś masakra, bo zrobiłeś tutaj tak:

zegarek *moj ,
zegarek &m =*moj;

Czyli:

  1. Stworzyłeś wskaźnik do obiektów zegarek który aktualnie wskazuje na LOSOWE MIEJSCE W PAMIĘCI, załóżmy że przechowuje adres 0x1234
  2. Do referencji m przypisałeś obiekt wskazywany przez wskaźnik moj, czyli obiekt pod adresem 0x1234
  3. Stworzyłeś obiekt zegarek dynamicznie alokując mu pamięć i przypisałeś do wskaźnika moj. Załóżmy że obiekt dostał adres 0x4321, taką też wartość przechowuje teraz wskaźnik moj
  4. Teraz próbujesz na obiekcie z którym łączy się referencja m wywołać metodę. Ale zauważ że za referencja pokazuje na obiekt pod adresem 0x1234! Co więcej, takiego obiektu NIE MA. Stąd też program wykrzaczy się przy próbie wywołania metody.
0

To "zachowanie " o którym mówisz podpatrzyłem stąd : http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node79.html
Bo wcześniej próbowałem wywołać funkcje tak:

zegarek *moj ;//&m =*moj; tego wczesniej nie bylo 
 
        //zegarek moj(ptm->tm_hour+GMT,ptm->tm_min, "wtorek\0"); 1. próba
 
        moj=new zegarek(ptm->tm_hour+GMT,ptm->tm_min,"wtorek\0"); //2. próba
 
        moj.pokaz_czas();

Ale wyskakiwał taki błąd : * request for member 'pokaz_czas' in 'moj', which is of non-class type 'zegarek*' * i tu nie wiedziałem co dalej robić więc wygoglowałem to co nazywasz masakrą.

Próbowałem zrobić jeszcze coś takiego :

zegarek::zegarek(int a,int b,char * c)
{ 
	
	
	godz=a ; 
	min=b ; 
	strcpy(dzien , c) ;
	pokaz_czas();
	};

Ale wg mnie to jest trochę kiepskie , bo po to definiuje klasę żeby z niej korzystać .

0

stwórz obiekt klasy zegarek i z niego korzystaj (ew potem wskaźnik na ten obiekt, ale tutaj to zbędne moim zdaniem ), doprowadzenie tego programu do działania to chwilka.

ps konstruktora nie kończy się };, to funkcja jak każda inna średnik po } dajemy tylko w przypadku klasy. Swoją drogą czemu całego konstruktora nie ma w klasie a tylko deklaracja?

0

OK! Dzięki za porady(przeczytam kilka rozdziałów wstecz ,żeby nie popełniać takich błędów ponownie) , ale jak pisałem wyżej ,to wróciłem do nauki (nie pisałem nic od 2 lat!) więc proszę o wyrozumiałość.Cała tą sytuacje rozwiązałem funkcją zaprzyjaźniona
Teraz to wygląda tak :

#include<stdio.h>
#include<string.h>
#include<time.h>

#define GMT (+2)

class zegarek {
	private:
		int godz,
			min;
			
		char  dzien[20];
	public:
		friend void odczyt(zegarek );
		zegarek(int ,int ,char *) ;//konstruktor

};
zegarek::zegarek(int a,int b,char * c)
{ 
	
	
	godz=a ; 
	min=b ; 
	strcpy(dzien , c) ;
	};
	
void odczyt(zegarek k ){
		printf("teraz mamy godzine %d:%d ",k.godz,k.min);
			printf(" w dniu %s",k.dzien);
		};
int main()
{
	time_t czas; 
	struct tm * ptm;
	
	time(&czas);
	ptm= gmtime(&czas);
	zegarek *moj ,&m =*moj;
	//zegarek moj(ptm->tm_hour+GMT,ptm->tm_min, "wtorek\0");
	moj=new zegarek(ptm->tm_hour+GMT,ptm->tm_min,"wtorek\0");
	
	odczyt(*moj);
	return 0;
}
0

Bo widzisz jak chcesz wywołać metodę z obiektu wskazywanego przez wskaźnik to robi sie to trochę inaczej:

zegarek* z = new zegarek();
z->metoda();
//albo
(*z).metoda();

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