bnvdarklord Δημοσ. 15 Ιουλίου 2013 Μέλος Δημοσ. 15 Ιουλίου 2013 Αν είχα βαλει θα δουλευε στο αρχικο παράδειγμα; Και εφόσον δουλευει με pointers γιατι εχω πρόβλημα που ειπες;
παπι Δημοσ. 15 Ιουλίου 2013 Δημοσ. 15 Ιουλίου 2013 Βαλε αυτα και θα δουλευει. Label(const Label<T>& other) { *this = other; } Label<T>& operator = (const Label<T>& other) { size = other.size; ptr = new T[size]; memcpy(criteria,other.criteria, sizeof(T) * size); return *this; } Βαλε αυτα και θα πεταει Label(Label<T>&& other) { *this = std::move(other); } Label<T>& operator = (Label<T>&& other) { if(this != &other) { size = other.size; criteria= other.criteria; other.size = 0; other.criteria = 0; } return *this; } 1
bnvdarklord Δημοσ. 15 Ιουλίου 2013 Μέλος Δημοσ. 15 Ιουλίου 2013 Ωραια θα τα δοκιμάσω, αλλα τι μου προσφέρουν αυτα;
παπι Δημοσ. 15 Ιουλίου 2013 Δημοσ. 15 Ιουλίου 2013 Αν είχα βαλει θα δουλευε στο αρχικο παράδειγμα; Και εφόσον δουλευει με pointers γιατι εχω πρόβλημα που ειπες; Γιατι... Ας πουμε εχεις ενα label x και κανεις το παρακατω (το οποιο γινεται πολλες φορες μεσα στους container) Label<int> y = x; To y τι ειναι; Ειναι copy; οχι εφοσον εχουν το ιδιο resource (το creatiareadsadasd οπως γραφεται τεσπα) ειναι ενα reference; οχι, το y εχει αλλο life time απο αυτο του x Αρα ειναι ενα... δεν ξερω τι 1
bnvdarklord Δημοσ. 15 Ιουλίου 2013 Μέλος Δημοσ. 15 Ιουλίου 2013 Καταλαβα, ευχαριστώ. Οποτε πλεον αντιγράφεται το ενα στο αλλο με το =. btw το ptr στο 1ο = operator τι ειναι;
παπι Δημοσ. 15 Ιουλίου 2013 Δημοσ. 15 Ιουλίου 2013 το criteria, ξεχασα να το αλλαξω. Τους operators τους εγραψα πριν καμια ωρα σε μια κλαση που υποθετικα θα ηταν σαν τη δικη σου. Που ναι ηταν χαχα template <class T> struct Label { T* ptr; size_t size; Label(size_t size) : size(size) { ptr = new T[size]; } ~Label() { if(ptr) delete[] ptr; } std::string ToString() const { std::string res; for(size_t i = 0; i < size; i++) { res += std::to_string(ptr[i]); res += ","; } res.pop_back(); return res; } T& operator[] (size_t idx) { return ptr[idx]; } Label(Label<T>&& other) { *this = std::move(other); } Label<T>& operator = (Label<T>&& other) { if(this != &other) { size = other.size; ptr = other.ptr; other.size = 0; other.ptr = 0; } return *this; } Label(const Label<T>& other) { *this = other; } Label<T>& operator = (const Label<T>& other) { size = other.size; ptr = new T[size]; memcpy(ptr,other.ptr, sizeof(T) * size); return *this; } };
bnvdarklord Δημοσ. 15 Ιουλίου 2013 Μέλος Δημοσ. 15 Ιουλίου 2013 Το δοκίμασα και δουλευει, σ'ευχαριστώ πολυ! Μια τελευταια απορία. Τα 2 πάνω που που εγραψες ειναι τα copy constructor και operator και τα 2 κατω(που ειπες θα πεταει) ειναι τα move; Στα copy αντιγράφεις ενα αντικειμενο στο άλλο, στο move τι κανεις; Το std::move δεν το χω ξαναδει.
παπι Δημοσ. 15 Ιουλίου 2013 Δημοσ. 15 Ιουλίου 2013 copy T::T(const T& other) T::operator= (const T& other) move T::T(T&& other) T::operator= (T&& other) Στο move μετακινεις το αντικειμενο πχ T x = *std::move(y) (το move απλα κανει typecast σε rval reference για νακαλεσει το move assingment και οχι το copy) οπου x ειναι το παλιο y και οπου y ειναι ενα τιποτα dead παπαλα καπουτ Το move ειναι παρα πολυ καλο σε τετοιες περιπτωσεις (δηλαδη με vectors κλπ) διοτι αποφευγεις τα duplicate (τα οποια ειναι παρα πολλα) 1
MitsakosGR Δημοσ. 22 Ιουλίου 2013 Δημοσ. 22 Ιουλίου 2013 Επίσης μία παρατήρηση, το template <typename T> bool Label<T>::operator <(const Label<T> &other) const { return !(*this > other); } είναι λάθος. Αν δεν είναι μεγαλύτερο δεν σημαίνει ότι είναι μικρότερο. Μπορεί απλά να είναι ίσο. Αν δεν θέλεις να γράψεις όλη τη σύγκριση για το μικρότερο απλά έλεγξε και την ισότητα. template <typename T> bool Label<T>::operator <(const Label<T> &other) const { return !( (*this > other) || (*this == other) ); } 1
albNik Δημοσ. 22 Ιουλίου 2013 Δημοσ. 22 Ιουλίου 2013 Υπάρχει και το '>=' Νομιζω return *this<other; θες να πεις.
bnvdarklord Δημοσ. 22 Ιουλίου 2013 Μέλος Δημοσ. 22 Ιουλίου 2013 Επίσης μία παρατήρηση Ναι, ευχαριστώ το εχω διορθώσει απλα δεν αλλαξα το αρχικο post.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα