pbp Δημοσ. 22 Μαΐου 2011 Δημοσ. 22 Μαΐου 2011 Γεια σας, έστω ότι έχω μία κλάση σε ένα αρχείο (μόνο με τις επικεφαλίδες), σε ένα άλλο αρχείο τον κώδικα των συναρτήσεων της προαναφερθείσας κλάσης και σε ένα άλλο αρχείο την συνάρτηση main(). Μήπως μπορείτε να μου πείτε τι πρέπει να κάνω για να τα συνδέσω αυτά μεταξύ τους και να κάνω compile το πρόγραμμά μου? Επίσης μπορείτε να μου εξηγήσετε τι ακριβώς παίζει με τα αρχεία .h .o kai .cpp ? Ευχαριστώ πολύ.
Technology fan Δημοσ. 22 Μαΐου 2011 Δημοσ. 22 Μαΐου 2011 Το .h είναι η βιβλιοθήκη σου. Συνήθως απλά αναφέρουμε τις συναρτήσεις ενώ τις υλοποιούμε στο .cpp αρχείο, ωστε να βρούμε γρήγορα και εύκολα ποιες μεθόδους υλοποιείς χωρίς να ψάχνεις σε 100άδες γραμμές κώδικα. Συνήθως δημιουργούμε ένα αρχείο .h και ένα .cpp για κάθε κλάση αν και δε σε απαγορεύει κανείς να δηλώσεις περισσότερες. Η σύνδεση γίνεται ώς εξής... Στο cpp πρέπει να κανεις # include "your.h" ωστε οι υλοποιήσεις σου να αναφέρονται στο σωστό αρχείο.. Ενώ για να μπορέσεις να χρησιμοποιήσεις αυτά στη main σου θα πρέπει και στη main.cpp να κάνεις # include "your.h"
pbp Δημοσ. 22 Μαΐου 2011 Μέλος Δημοσ. 22 Μαΐου 2011 Το .h είναι η βιβλιοθήκη σου. Συνήθως απλά αναφέρουμε τις συναρτήσεις ενώ τις υλοποιούμε στο .cpp αρχείο, ωστε να βρούμε γρήγορα και εύκολα ποιες μεθόδους υλοποιείς χωρίς να ψάχνεις σε 100άδες γραμμές κώδικα. Συνήθως δημιουργούμε ένα αρχείο .h και ένα .cpp για κάθε κλάση αν και δε σε απαγορεύει κανείς να δηλώσεις περισσότερες. Η σύνδεση γίνεται ώς εξής... Στο cpp πρέπει να κανεις # include "your.h" ωστε οι υλοποιήσεις σου να αναφέρονται στο σωστό αρχείο.. Ενώ για να μπορέσεις να χρησιμοποιήσεις αυτά στη main σου θα πρέπει και στη main.cpp να κάνεις # include "your.h" Ευχαριστώ πολύ! και κάτι τελευταίο... Για να γίνει compile στη main.cpp δεν πρέπει να υπάρχουν και τα ".ο" αρχεία?? Αυτά πως δημιουργούνται ?
Technology fan Δημοσ. 22 Μαΐου 2011 Δημοσ. 22 Μαΐου 2011 Όχι δε χρειάζεται να κάνεις κάτι, αυτά δημιουργούνται αυτόματα απο το περιβάλλον που χρησιμοποιείς.
pbp Δημοσ. 22 Μαΐου 2011 Μέλος Δημοσ. 22 Μαΐου 2011 Όχι δε χρειάζεται να κάνεις κάτι, αυτά δημιουργούνται αυτόματα απο το περιβάλλον που χρησιμοποιείς. Οκ σ ευχαριστώ πολύ! πάω να το δοκιμάσω
παπι Δημοσ. 22 Μαΐου 2011 Δημοσ. 22 Μαΐου 2011 Γεια σας, έστω ότι έχω μία κλάση σε ένα αρχείο (μόνο με τις επικεφαλίδες), σε ένα άλλο αρχείο τον κώδικα των συναρτήσεων της προαναφερθείσας κλάσης και σε ένα άλλο αρχείο την συνάρτηση main(). Μήπως μπορείτε να μου πείτε τι πρέπει να κάνω για να τα συνδέσω αυτά μεταξύ τους και να κάνω compile το πρόγραμμά μου? Επίσης μπορείτε να μου εξηγήσετε τι ακριβώς παίζει με τα αρχεία .h .o kai .cpp ? Ευχαριστώ πολύ. .h .hpp .c .cpp etc ειναι perfix στο κατω κατω οταν κανεις compile ολαααα αυτα γινονται ενα. Συνυθως στα .h βαζουμε τα declarations στα .hpp τα inline στα c/cpp το source code για να ειναι πιο ευκολο στη κατανοηση (εξαλλου μπορεις να φτιαξεις ενα προγραμμα μεσα μονο σε ενα αρχειο). Αυτο που σε μπερδευει ειναι συνδεση μεταξυ τους. Δικαιολογημενα, εφοσον υπαρχουν δυο ειδη συνδεσης 1) με include 2) κουμπωμα στο project/makefile/compiler (ενα ειναι αυτο) φυσικα αυτα τα δυο δεν κανουν το ιδιο πραγμα. Τα h/hpp (header files) περιεχουν τα declarations πιο λιανα, περιεχουν τις λεξεις-κλειδια που εχει το προγραμμα σου (πχ void foo(); κ. compiler οταν δεις αυτο εδω να ξερεις οτι ειναι μια συναρτηση). Με το include στην ουσια κανεις μια ενωση. px something.h > void foo(); void fee(); void bar(); somthingelse.h > void faa(); #include "somthing.h" void arg(); main.cpp > #include "somthingelse.h" int main() { return 1; } Ολο αυτο το πραγμα, ο compiler θα το δει καπως ετσι > void faa(); void foo(); void fee(); void bar(); void arg(); int main(.... Αυτο ειναι. Βεβαια υπαρχει ενα προβλημα οταν κανεις δυο φορες include τον ιδιο header πχ main.cpp > #include "somthingelse.h" #include "somthing.h" int main() { return 1; } το αποτελεσμα θα ειναι αυτο > void faa(); void foo(); void fee(); void bar(); void arg(); void foo(); void fee(); void bar(); int main(.... aka πολλα errors για να λυσεις αυτο το πραγμα, θα βαλεις εναν file guard px το standarifndef def endif ή καποιο extension του compiler πχ vc++ #pragma once Τα source code files δεν τα κανεις include (αν και μπορεις). Αυτα ειναι που μπαινουν στον compiler (σε αντιθεση με τα h που δεν μπαινουν απεθειας στο compiler αλλα μεσου του source code file). Σε ενα project πρεπει να μπουν ολα τα source file. Εσενα δεν πρεπει να σε ενδιαφερει με τη σειρα θα μπουν, αυτο που πρεπει αυστηρος να κανεις ειναι σε καθε source file να εχεις πανω πανω include τα declaration file που χρησιμοποιεις μεσα στο αρχειο Αρα στο προβλημα σου στο αρχειο className.h >#ifndef INC_CLASSNAME_H #define INC_CLASSNAME_H class className { public: void foo(); }; #endif className.cpp >#include <stdio.h> #include "className.h" void className::foo() { printf("Hello"); } main.cpp >#include "className.h" int main() { className c; c.foo(); return 0; }
pbp Δημοσ. 25 Μαΐου 2011 Μέλος Δημοσ. 25 Μαΐου 2011 Ρε παιδιά δεν ξέρω τι γίνεται ... Έχω κάνει κατά γράμμα αυτά που μου περιγράψατε παραπάνω αλλά όταν πάω να κάνω compile μου βγάζει linker error Τι μπορεί να κάνω λάθος?? Δεν έχω ξεχάσει κανένα #include και όλα τα αρχεία μου τα έχω στον ίδιο φάκελο... :/
Technology fan Δημοσ. 25 Μαΐου 2011 Δημοσ. 25 Μαΐου 2011 Αν μπορείς να τα ποστάρεις να τα δούμε ενδεχομένως να σου πούμε. Ένα συνηθισμένο λάθος είναι να βάζεις <> αντί για " " στο include.
pbp Δημοσ. 26 Μαΐου 2011 Μέλος Δημοσ. 26 Μαΐου 2011 Αν μπορείς να τα ποστάρεις να τα δούμε ενδεχομένως να σου πούμε. Ένα συνηθισμένο λάθος είναι να βάζεις <> αντί για " " στο include. ορίστε ένα μικρό παράδειγμα.. μου βγάζει linker error και συνεπώς δεν μπορούν να δημιουργηθούν καν τα .ο αρχεία. main.cpp: > #include <iostream> #include "dokimi.h" using namespace std; int main(int argc, char *argv[]) { dokimi a,b(10); a.show(); b.show(); getchar(); } dokimi.h: >class dokimi { private: int a; public: dokimi(); dokimi(int k); void show(); }; dokimi.cpp: >#include"dokimi.h" #include<iostream> using namespace std; dokimi::dokimi() { a=0; } dokimi::dokimi(int k) { a=k; } void dokimi::show() { cout<<a<<endl; }
παπι Δημοσ. 26 Μαΐου 2011 Δημοσ. 26 Μαΐου 2011 Linker error, ο compiler δεν βλεπει το source code. Εχεις βαλει το .cpp στο project ( ή αν το πας με promp εχεις βαλει και το .cpp της class);
V.I.Smirnov Δημοσ. 26 Μαΐου 2011 Δημοσ. 26 Μαΐου 2011 @παπι Αντίθετα με ότι πιστεύεται, οι οδηγίες που έδωσες σε προηγούμενο post ΔΕΝ δουλεύουν πάντα, δυστυχώς. Π.χ. στο thread για το splay tree (εδώ : http://www.insomnia.gr/topic/408891-%ce%b4%ce%bf%ce%bc%ce%b7-splay-tree/) που έθεσα κώδικα παρατήρησε ότι στο αρχείο με την main έχω κάνει include όχι μόνον το *.h file της κλάσης αλλά και το *.cpp με την υλοποίησή της. Δηλ. #include "SplayTree.h" #include "SplayTree.cpp" Φυσιολογικά, μόνον το *.h έπρεπε να αρκεί όπως είπες και όπως όντως συμβαίνει στις περισσότερες περιπτώσεις. Aλλά εδώ, αν δεν βάλω το και το source της κλάσης, δηλ. το SplayTree.cpp, δίνει link error !! Και βέβαια τα είχα και τα τρία στο project και στον ίδιο φάκελο (VS 2008). Σκέφτηκα μήπως φταίει που έχω τους constructors στο *.h (ήταν πολύ μικροί και τους έβαλα εκεί). Δοκίμασα λοιπόν να τους μεταφέρω στο .cpp ώστε το *.h να έχει καθαρά μόνον δηλώσεις. Το ίδιο τσαλίμι κάνει. Δεν το έψαξα περισσότερο αφού δούλεψε με το include του cpp αλλά το ερωτηματικό παραμένει... Aς δοκιμάσει ο φίλος να κάνει το ίδιο - δηλ. προσάρτηση και του *.cpp της κλάσης στο αρχείο με την main - μήπως δουλέψει... -
pbp Δημοσ. 26 Μαΐου 2011 Μέλος Δημοσ. 26 Μαΐου 2011 Οι οδηγίες που έδωσες σε προηγούμενο post δεν δουλεύουν πάντα, δυστυχώς. Π.χ. στο thread για το splay tree (εδώ : http://www.insomnia.gr/topic/408891-%ce%b4%ce%bf%ce%bc%ce%b7-splay-tree/) που έθεσα κώδικα παρατήρησε ότι στο αρχείο με την main έχω κάνει include όχι μόνον το *.h file της κλάσης αλλά και το *.cpp με την υλοποίησή της. Δηλ. #include "SplayTree.h" #include "SplayTree.cpp" Φυσιολογικά, μόνον το *.h έπρεπε να αρκεί όπως είπες και όπως όντως συμβαίνει στις περισσότερες περιπτώσεις. Aλλά εδώ, αν δεν βάλω το και το source της κλάσης, δηλ. το SplayTree.cpp, δίνει link error !! Και βέβαια τα είχα και τα τρία στο project και στον ίδιο φάκελο (VS 2008). Σκέφτηκα μήπως φταίει που έχω τους constructors στο *.h (ήταν πολύ μικροί και τους έβαλα εκεί). Δοκίμασα λοιπόν να τους μεταφέρω στο .cpp ώστε το *.h να έχει καθαρά μόνον δηλώσεις. Το ίδιο τσαλίμι κάνει. Δεν το έψαξα περισσότερο αφού δούλεψε με το include του cpp αλλά το ερωτηματικό παραμένει... Aς δοκιμάσει ο φίλος να κάνει το ίδιο - δηλ. προσάρτηση και του *.cpp της κλάσης στο αρχείο με την main - μήπως δουλέψει... - Όντως τώρα δουλεύει με το ".cpp" στη main... Πρώτον, και εγώ δεν κατάλαβα πως γίνεται αυτό.. :S Δεύτερον, δεν δημιουργήθηκε κανένα ".ο" αρχείο παρά μόνο το "main.exe"... Χωρίς ".ο" αρχεία είναι ψιλόάχρηστο γιατί δεν μπορώ να το δώσω σε κάποιον χωρίς αυτός να μπορεί να δει τον κώδικά μου...
V.I.Smirnov Δημοσ. 26 Μαΐου 2011 Δημοσ. 26 Μαΐου 2011 Είχα δίκιο λοιπόν ! Όσο για την αιτία, το ερώτημα είναι αναπάντητο και για μένα... -
Technology fan Δημοσ. 26 Μαΐου 2011 Δημοσ. 26 Μαΐου 2011 Πολύ περίεργο μου φαίνεται, έφτιαξα ένα project στο netbeans με τις κλασεις ακριβώς έτσι όπως τα πόσταρες, και δεν είχε κάποιο πρόβλημα περί link error. Εσύ με ποιό πρόγραμμα κάνεις compile,build.. Eκτός αν το δουλεύεις απο terminal / command promt
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.