berkov Temat założony przez niniejszego użytkownika |
Kolejnosc kompilacji - kompilator sie uparl! » 2012-12-22 10:15:54 Hey ho!.. albo to mnie zacmilo albo kompilator (Visual Studio 2012) sie na mnie uparl. Mam nastepujace pliki: Main.cpp: #include <windows.h> #include <windowsx.h> #include "classes.cpp" #include "resources.h" #include "db.h"
classes.cpp: #include <windows.h> i definicje klas i struktur resources.h: zawiera od razu same #define roznych IDD i IDC z dialogow i kontrolek w resources.rc db.h zawiera od razu same definicje funkcji pozniej napisanych w db.cpp jest jeszcze plik db.cpp: #include <windows.h> #include "db.h" #import "C:\Program Files\Common Files\System\ado\msado26.tlb" rename( "EOF", "ADOEOF" ) i dalej body funkcji wczesniej zainicjowanycgh w db.h po nacisnieciu kompiluj kompilator ZAWSZE zaczyna kompilowac od db.cpp oczywiscie odnoszac sie do np klas ktore zdeklarowane sa dopiero w classes.cpp i wywala blad. wiec pomyslalem ze celowo wymusze zeby db.cpp sie kompilowalo dopiero po classes.cpp i main zmienilem na nastepujace: Main.cpp: #include <windows.h> #include <windowsx.h> #include "classes.cpp" #include "resources.h" #include "db.h" #include "db.cpp"
i co? i kompilator uparcie dalej zaczyna od db.cpp a ja chce zeby zaczal od classes.cpp poniewaz tam deklaruje klasy ktore pozniej sa uzywane w db.cpp |
|
m4tx |
» 2012-12-22 10:31:52 Dzielisz kod w zły sposób :) Nie posiadasz pliku nagłówkowego dla pliku classes.cpp (czyli nie utworzyłeś pliku classes.hpp lub classes.h) i wskutek tego po prostu to nigdy nie będzie działać. Kolejność kompilowania nie ma tu nic do rzeczy. Tutaj masz tutorial - przeczytaj i powinieneś wiedzieć już jak to zrobić :) Dzielenie kodu na kilka plików źródłowych |
|
berkov Temat założony przez niniejszego użytkownika |
» 2012-12-22 11:15:31 Wczesniej wszystko dzialalo dopoki nie odnioslem sie do mojej klasy (USERS) w db.cpp ktora byla zdeklarowana w classes.cpp albo w main.cpp... nie mniej jednak sprobowalem tego co powiedziales. w main.cpp zamienilem #include "classes.cpp" na #include "classes.h". utworzylem classes.h piszac w nich naglownki (class USERS;) moich klas ktore pozniej sa zdefiniowane w classes.cpp. w classes. cpp dodalem rowniez #include classes.h... i co? teraz ta klasa jest nawet niedostepna w main.cpp:
main.cpp(21): error C2512: 'USERS' : no appropriate default constructor available main.cpp(226): error C2027: use of undefined type 'USERS'
konstruktora w klasie nie mam bo go nie potrzebuje, niech bedzie automatyczny.. ale probowalem rowniez stowrzyc swoj wlasny konstruktor zerujacy wszystkie publiczne zmienne (zeby cos sobie robil) i pomimo tego dalej dostaje info ze no appropriate default constructor available.
---- UPDATE: dodam tylko ze linia main.cpp(21) todeklaracja: USERS *user_info = new USERS; gdzie drugie slowo USERS (po new) jest podkreslone na czerwono z komunikatem "incomplete type is not allowed" |
|
kubawal |
» 2012-12-22 11:18:43 Dyrektywą #include załączasz tylko pliki *.h i *.hpp! Jaki jest kod? |
|
berkov Temat założony przez niniejszego użytkownika |
» 2012-12-22 11:24:50 @kubawal, wiem ze mozna zalaczyc tez plik *.cpp bo nie raz probowalem .. ale zgodnie z rada m4tx wszedzie mam juz zalaczone *.h ktore "predefinuja" to co pozniej dokladnie definiuje w odpowiednich *.cpp. Kod jest juz bardzo dlugi, kikunasto stronnicowy, nie ma sensu go wklejac. |
|
xevuel |
» 2012-12-22 11:29:52 Kod jest juz bardzo dlugi, kikunasto stronnicowy, nie ma sensu go wklejac. |
Nasza odpowiedź definiująca wszystkie możliwe przypadki popełnienia błędu też jest już bardzo długa, kilkunastostronicowa, i nie ma sensu jej wklejać. |
|
kubawal |
» 2012-12-22 11:38:04 Dyrektywa #include po prostu wkleja całą zawartość pliku, który ma podany. Nie interesuje ją jakiego formatu jest plik. Jeśli załączasz pliki *.cpp, to pewnie wyskakiwały ci błędy typu class USER is already defined :) |
|
berkov Temat założony przez niniejszego użytkownika |
» 2012-12-22 11:42:24 @xevuel kod posiada duzo (nazwijmy to) poufnych informacji pewnej firmy. Mowiac ze nie ma sensu wklejac "kilkunasto stronnicowego kodu" mialem na mysli nie to ze mi sie nie chce ale bardziej ze 1. i tak nikomu nie bedzie sie chcialo go calego analizowac. 2.zmiana wszystkich tych informacji doprowadzi do modyfikacji kodu do tego stopnia ze pomoc moze okazac sie srednio juz potrzebna. Dlatego tez pomyslalem ze informacje ktore dostarczylem powinny byc wystarczajace. wkleje tylko nastepujace classes.h: #ifndef classes_h #define classes_h class INVOICES; class USERS; #endif classes.cpp: #include <windows.h> #include "classes.h" class USERS { public: unsigned long usr_id; LPSTR usr_name; LPSTR usr_pass; char usr_auth_login[ 1 ]; char usr_invoices[ 1 ]; };
main.cpp: #include <windows.h> #include <windowsx.h> #include "classes.h" #include "resources.h" #include "db.h" (..) USERS * user_info = new USERS; (...) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) (...) itd
resources.h i .rc nie bede wkleja bo nie ma sensu. plik db.cpp posiada definicje funkcji dostepu do bazy danych, zaczyna sie nastepujaco db.cpp: #include <windows.h> #include "db.h" #import "C:\Program Files\Common Files\System\ado\msado26.tlb" rename( "EOF", "ADOEOF" ) |
|
« 1 » 2 |