bnvdarklord Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Τι βλακεία εχω κάνει για να βγάζει linker error για unresolved symbol σε αυτό Obj obj(10, 20, "30"); αλλά να κάνει κανονικά compile, και να δουλεύει οπως πρέπει με Obj* obj = new Obj(10, 20, "30");
H_ANARXIA_EINAI_PSEMA Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Δώσε ένα παράδειγμα κώδικα που συμβαίνει αυτό.
παπι Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Το declaration που ειναι; ΥΓ: Κανε και ενα compile το αρχειο με το definition του obj
bnvdarklord Δημοσ. 17 Μαΐου 2014 Μέλος Δημοσ. 17 Μαΐου 2014 Παίζει να φταίει που εχω declarations και definitions των κλασεων σε ένα .h αρχειο αντι για χωριστα Όλο λεω να τα χωρίσω μετα απο ενα αλλο thread που ειχα ρωτησει γιατι ειναι καλυτερο, αλλα όλο το αφηνα γιατι ειναι πολλα τα αρχεία.
defacer Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Μπορεί να παραβιάζεις το one definition rule, ή μπορεί να είναι το "most vexing parse". Δώσε τον αληθινό κώδικα και όλα τα warnings/errors.
bnvdarklord Δημοσ. 17 Μαΐου 2014 Μέλος Δημοσ. 17 Μαΐου 2014 defacer ευχαριστώ, αλλα δεν νομίζω οτι ειναι αυτό, καθώς δεν μου βγάζει το σφάλμα που λεει στο άρθρο. Εμένα βγάζει "unresolved external symbol" για το Obj στο VS2010, ενώ στο g++ που δοκίμασα τωρα undefined reference to Objedit:Λοιπον προσπαθωντας να σας δείξω τον ελαχιστο κωδικα που τα κανει αυτα σβηνοντας πραγματα βρήκα τι έφταιγε.Στην κλαση Obj είχα δηλώσει τον deconstructor ~Obj(); χωρίς body. Μόλις το έσβησα, το πρόβλημα διορθώθηκε.Μπορει κανεις να μου εξηγίσει γιατί δημιουργούσε αυτό το πρόβλημα ;
H_ANARXIA_EINAI_PSEMA Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Δεν μπορείς να το καταστρέψεις το αντικείμενο αν δεν υπάρχει ο destructor. Όταν κάνεις new, προφανώς δεν κάνεις delete, οπότε δεν υπάρχει πρόβλημα. Όταν το κάνεις declare σε local scope, όταν περνάει από την ζωή του το αντικείμενο (out of scope), ο destructor δεν υπάρχει. struct Foo { ~Foo(); int bar(void) const; // gia paradigma }; int main(void) { // Error 1: // Foo foo; Foo *foo = new Foo{}; // Error 2: //delete foo; return 0; } 1
bnvdarklord Δημοσ. 17 Μαΐου 2014 Μέλος Δημοσ. 17 Μαΐου 2014 Ευχαριστώ. Νόμιζα ότι έχοντας δηλώσει έτσι τον deconstructor θα ήταν σαν να είναι απλά αδειος.
albNik Δημοσ. 17 Μαΐου 2014 Δημοσ. 17 Μαΐου 2014 Εφτιαξες pure virtual destructor. Α pure virtual destructor must have an implementation. http://stackoverflow.com/a/4998412 Στο δευτερο θα ειχες error αν καλουσες το destructor delete obj; 1
bnvdarklord Δημοσ. 17 Μαΐου 2014 Μέλος Δημοσ. 17 Μαΐου 2014 Στο δευτερο θα ειχες error αν καλουσες το destructor delete obj; Ναι, όπως ηταν και αναμενόμενο με βαση αυτα που μου εξηγίσατε. Thanks.
παπι Δημοσ. 18 Μαΐου 2014 Δημοσ. 18 Μαΐου 2014 Παίζει να φταίει που εχω declarations και definitions των κλασεων σε ένα .h αρχειο αντι για χωριστα Όλο λεω να τα χωρίσω μετα απο ενα αλλο thread που ειχα ρωτησει γιατι ειναι καλυτερο, αλλα όλο το αφηνα γιατι ειναι πολλα τα αρχεία. Οπως σου ειπα και πριν. ΧΩΡΙΣΕ ΤΑ. Θα κερδισεις χρονο εφοσον δεν θα γινονται ολα compile.
bnvdarklord Δημοσ. 18 Μαΐου 2014 Μέλος Δημοσ. 18 Μαΐου 2014 Οπως σου ειπα και πριν. ΧΩΡΙΣΕ ΤΑ. Θα κερδισεις χρονο εφοσον δεν θα γινονται ολα compile. Λοιπόν τα χώρισα. Δυστυχώς έχω καμια 20αρια linker errors για unresolved symbol. Εβαλα πολυ κωδικα σε σχολια ωστε να μεινει μονο ενα τετοιο ερρορ, αλλα και παλι δεν μπορω να καταλάβω με τίποτα τι παίζει. Το error ειναι αυτό: Error 1 error LNK2001: unresolved external symbol "public: __thiscall Label<float>::~Label<float>(void)" (??1?$Label@M@@QAE@XZ) C:\Users\...\Project\Algorithm.obj Project Η μοναδική αναφορά της κάσης Label στην Algorithm.cpp και Algorithm.h είναι στα ορίσματα μιας συνάρτησης(η οποία ειναι αδεια, λογω των σχολιων που έβαλα). Εχω κάνει include το Label.h στο Algorithm.h. Ο destructor της Label έχει τον κωδικα του στο Label.cpp. Καμια ιδεα τι μπορει να φταίει;
παπι Δημοσ. 18 Μαΐου 2014 Δημοσ. 18 Μαΐου 2014 Τα template δεν τα βαζεις σε *.cpp επειδη αυτα δεν γινονται compile.
bnvdarklord Δημοσ. 18 Μαΐου 2014 Μέλος Δημοσ. 18 Μαΐου 2014 Δηλαδή σε ότι κλάση έχω <Τ> θα τα έχω όλα σε ενα .h όπως πριν;
παπι Δημοσ. 18 Μαΐου 2014 Δημοσ. 18 Μαΐου 2014 Οπου υπαρχει το Τ. αν θες ανεβασε το προτζεκτ να στο χωρισω
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα