Προς το περιεχόμενο

Σύνδεση αρχείων ( C++ ).


pbp

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

έστω ότι έχω μία κλάση σε ένα αρχείο (μόνο με τις επικεφαλίδες), σε ένα άλλο αρχείο τον κώδικα των συναρτήσεων της προαναφερθείσας κλάσης και σε ένα άλλο αρχείο την συνάρτηση main().

Μήπως μπορείτε να μου πείτε τι πρέπει να κάνω για να τα συνδέσω αυτά μεταξύ τους και να κάνω compile το πρόγραμμά μου?

Επίσης μπορείτε να μου εξηγήσετε τι ακριβώς παίζει με τα αρχεία .h .o kai .cpp ?

Ευχαριστώ πολύ.

Δημοσ.

Το .h είναι η βιβλιοθήκη σου. Συνήθως απλά αναφέρουμε τις συναρτήσεις ενώ τις υλοποιούμε στο .cpp αρχείο, ωστε να βρούμε γρήγορα και εύκολα ποιες μεθόδους υλοποιείς χωρίς να ψάχνεις σε 100άδες γραμμές κώδικα. Συνήθως δημιουργούμε ένα αρχείο .h και ένα .cpp για κάθε κλάση αν και δε σε απαγορεύει κανείς να δηλώσεις περισσότερες.

 

Η σύνδεση γίνεται ώς εξής...

 

Στο cpp πρέπει να κανεις # include "your.h" ωστε οι υλοποιήσεις σου να αναφέρονται στο σωστό αρχείο..

 

Ενώ για να μπορέσεις να χρησιμοποιήσεις αυτά στη main σου θα πρέπει και στη main.cpp να κάνεις # include "your.h"

Δημοσ.

Το .h είναι η βιβλιοθήκη σου. Συνήθως απλά αναφέρουμε τις συναρτήσεις ενώ τις υλοποιούμε στο .cpp αρχείο, ωστε να βρούμε γρήγορα και εύκολα ποιες μεθόδους υλοποιείς χωρίς να ψάχνεις σε 100άδες γραμμές κώδικα. Συνήθως δημιουργούμε ένα αρχείο .h και ένα .cpp για κάθε κλάση αν και δε σε απαγορεύει κανείς να δηλώσεις περισσότερες.

 

Η σύνδεση γίνεται ώς εξής...

 

Στο cpp πρέπει να κανεις # include "your.h" ωστε οι υλοποιήσεις σου να αναφέρονται στο σωστό αρχείο..

 

Ενώ για να μπορέσεις να χρησιμοποιήσεις αυτά στη main σου θα πρέπει και στη main.cpp να κάνεις # include "your.h"

 

Ευχαριστώ πολύ!

και κάτι τελευταίο...

Για να γίνει compile στη main.cpp δεν πρέπει να υπάρχουν και τα ".ο" αρχεία??

Αυτά πως δημιουργούνται ?

Δημοσ.

Όχι δε χρειάζεται να κάνεις κάτι, αυτά δημιουργούνται αυτόματα απο το περιβάλλον που χρησιμοποιείς.

 

Οκ σ ευχαριστώ πολύ!

πάω να το δοκιμάσω :)

Δημοσ.

Γεια σας,

έστω ότι έχω μία κλάση σε ένα αρχείο (μόνο με τις επικεφαλίδες), σε ένα άλλο αρχείο τον κώδικα των συναρτήσεων της προαναφερθείσας κλάσης και σε ένα άλλο αρχείο την συνάρτηση 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;
}

 

Δημοσ.

Ρε παιδιά δεν ξέρω τι γίνεται ...

Έχω κάνει κατά γράμμα αυτά που μου περιγράψατε παραπάνω αλλά όταν πάω να κάνω compile μου βγάζει linker error

Τι μπορεί να κάνω λάθος??

Δεν έχω ξεχάσει κανένα #include και όλα τα αρχεία μου τα έχω στον ίδιο φάκελο...

:/

Δημοσ.

Αν μπορείς να τα ποστάρεις να τα δούμε ενδεχομένως να σου πούμε.

 

Ένα συνηθισμένο λάθος είναι να βάζεις <> αντί για " " στο include.

Δημοσ.

Αν μπορείς να τα ποστάρεις να τα δούμε ενδεχομένως να σου πούμε.

 

Ένα συνηθισμένο λάθος είναι να βάζεις <> αντί για " " στο 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;
}

Δημοσ.

Linker error, ο compiler δεν βλεπει το source code. Εχεις βαλει το .cpp στο project ( ή αν το πας με promp εχεις βαλει και το .cpp της class);

Δημοσ.

@παπι

 

Αντίθετα με ότι πιστεύεται, οι οδηγίες που έδωσες σε προηγούμενο 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 - μήπως δουλέψει...

 

-

Δημοσ.

Οι οδηγίες που έδωσες σε προηγούμενο 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"...

Χωρίς ".ο" αρχεία είναι ψιλόάχρηστο γιατί δεν μπορώ να το δώσω σε κάποιον χωρίς αυτός να μπορεί να δει τον κώδικά μου...

Δημοσ.

Πολύ περίεργο μου φαίνεται, έφτιαξα ένα project στο netbeans με τις κλασεις ακριβώς έτσι όπως τα πόσταρες, και δεν είχε κάποιο πρόβλημα περί link error. Εσύ με ποιό πρόγραμμα κάνεις compile,build.. Eκτός αν το δουλεύεις απο terminal / command promt

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...