r4dical Napisano Październik 27, 2019 Autor Zgłoś Udostępnij Napisano Październik 27, 2019 takie male pytanko. pisze projekt w visuallu bez MFC. sklada sie on z kilku plikow .h i chcialbym, zeby skladal sie takze z kilku .cpp gdzie umieszczam sobie jakies funkcje. problem polega na tym , ze do wszystkich klas zawartych w plikach .h moge sie dostac z glownego pliku .cpp. to zrozumiale, bo includuje w tym pliku wszystkie naglowki, w tym ten, gdzie jest klasa, ktorej funkcje wywoluje. nie potrafie jednak dostac sie do klas jakiegokolwiek naglowka z innego pliku .cpp (czytaj nie glownego.) nie moge tam zainkludowac plikow .h poniewaz sa juz zainkludowane w glownym .cpp (gdzie jest funkcja main) nie dzialaja tez polecenie extend. kompilator pisze "undefined class ...". nie wiem jak to zrobic, nie wiem gdzie tak naprawde w kodzie programu jest dodawany taki plik .cpp ktory mam w swoim projekcie. pozdrawiam i jak zykle licze na kilka zdan fachowcow. Mariusz Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Październik 28, 2019 Zgłoś Udostępnij Napisano Październik 28, 2019 nie moge tam zainkludowac plikow .h poniewaz sa juz zainkludowane w glownym .cpp (gdzie jest funkcja main) Być może źle zrozumiałem problem ale nie bardzo wiem dlaczego nie możesz zainkludować tam tych plików. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
r4dical Napisano Październik 28, 2019 Autor Zgłoś Udostępnij Napisano Październik 28, 2019 juz wiem, gdzie jest problem, chociaz rozwiazania nie znalazlem. moge inkludowac wszystkie naglowki w kazdym pliku .cpp i wszystko pieknie smiga. problem pojawia sie jesli jakas klasa zdefiniowana w inkludowanym naglowku posiada cialo jakiejs jej funkcji zdefiniowane poza klasa w tym samym pliku. kompilator podaje wtedy, ze zdefiniowano powtornie ta funkcje. czyli nadal mam ten sam problem. przytocze przyklad: klasa1.h class klasa1 { void funkcja (void) {} }; ------------------------------- klasa2.h class klasa2 { void funkcja (void); }; void klasa2::funkcja(void) {} ------------------------- main.cpp #include klasa1.h #include klasa2.h klasa1 k1; //definicja obiektow globalnych klasa2 k2; ------------------------------- dodatkowy.cpp #include klasa1.h #include klasa2.h //i tu przy kompilacji pojawia sie komunikat o powtornym definiowaniu funkcji z klasy2. nie pomaga wyposazenie naglowkow w #pragma czy #ifndef. do klasy1 kompilator sie nie czepia. klasy mam dosc duze, wiec nie chce cial funkcji umieszczac wewnatrz. z tego co wiem beda umieszczane w calosci w miejscach, gdzie bede je wywolywal. druga sprawa tak przy okazji. sprawdzilem w roznych naglowkach i doszedlem, ze jesli mam naglowek ktory nazywa sie np. header.h to ifndef powinno wygladac tak: #ifndef _header_h_ a pragma tak: #pragma once _header_h_ czy tak wlasnie powinno byc? moze tu robie blad i jest on powodem reszty komplikacji. z drugiej jednak strony klasa1 kompiluje sie dobrze. pozdrawiam i rece juz rozkladam. narazie caly progs mam w jednym cpp i to chodzi ale nie wyglada to fajnie. Mariusz Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Freak Napisano Październik 29, 2019 Zgłoś Udostępnij Napisano Październik 29, 2019 Nazwa przy #ifndef nie ma znaczenia. W każdym pliku nagłówkowym zrób #ifndef COŚ_TAM #define COŚ_TAM deklaracje klas #endif i musi działać :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Październik 29, 2019 Zgłoś Udostępnij Napisano Październik 29, 2019 Dobra praktyka programistycza mówi że nie powinno się definiować funkcji w plikach nagłówkowych. Dlaczego? To chyba już wiesz. Może zrób to w taki sposób: //klasa1.h class klasa1 { void funkcja(void) {} }; ---------------------------------------------------------- //klasa2.h class klasa2 { void funkcja(void); } ---------------------------------------------------------- //klasa2.cpp #include "klasa2.h" void klasa2::funkcja(void){} ---------------------------------------------------------- Jak widzisz funkcja z klasy klasa2 jest definiowana w pliku klasa2.cpp. Teraz możesz bez problemu dołączać plik klasa2.h tyle razy ile tylko chcesz i nie powinno być żadnych problemów. Pliki klasa2.h i klasa2.cpp stanowią w tym wypadku komplet. Jak widzisz twój plik klasa2.h został rozłożony na dwa mniejsze. Jeżeli ten opis jest mało zrozumiały to napisz postaram się opisać to szerzej. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
r4dical Napisano Październik 29, 2019 Autor Zgłoś Udostępnij Napisano Październik 29, 2019 dziekuje za podpowiedzi. wyglada na to, ze klopot byl z umieszczaniem cial funkcji w pliku .h razem z klasa. takie rozwiazanie wydawalo sie najlepsze, z reszta chyba tez logiczne. troche mi sie nie podoba ze musze teraz dzielic klase na deklaracje w jednym pliku a funkcje w drugim. ale nic to. rozumiem juz o co chodzilo. pozdrawiam serdecznie Mariusz Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Cipher Napisano Październik 30, 2019 Zgłoś Udostępnij Napisano Październik 30, 2019 Szczerze mówiąc nie wiem dlaczego Ci się ten podział nie podoba ale jeżeli koniecznie chcesz mieć to w jednym pliku to może użyj dla funkcji specyfikatora inline. Po krótce mówiąc spowoduje on że kompilator będzie traktował takie funkcje jak by były zdefiniowane wewnątrz klasy a co za tym idzie nie powinno być z nimi problemu. Przykład: //klasa2.h class klasa2 { inline void funkcja(void); } void klasa2::funkcja(void) { } ps. Pragnę zaznaczyć że nie polecam stosowania tego sposobu. Ma on po prostu wiele wad i nie jest mile widziany przez programistów. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.