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

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

Δημοσ.

Βαλε αυτα και θα δουλευει.


	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;
	}
  • Like 1
Δημοσ.

Αν είχα βαλει θα δουλευε στο αρχικο παράδειγμα; Και εφόσον δουλευει με pointers γιατι εχω πρόβλημα που ειπες;

 

Γιατι... Ας πουμε εχεις ενα label x και κανεις το παρακατω (το οποιο γινεται πολλες φορες μεσα στους container)

 

Label<int> y = x;

 

To y τι ειναι; Ειναι copy; οχι εφοσον εχουν το ιδιο resource (το creatiareadsadasd οπως γραφεται τεσπα)

ειναι ενα reference; οχι, το y εχει αλλο life time απο αυτο του x

Αρα ειναι ενα... δεν ξερω τι  :-)

  • Like 1
Δημοσ.

το 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;
	}
}; 

 

 

Δημοσ.

Το δοκίμασα και δουλευει, σ'ευχαριστώ πολυ!

 

Μια τελευταια απορία. Τα 2 πάνω που που εγραψες ειναι τα copy constructor και operator και τα 2 κατω(που ειπες θα πεταει) ειναι τα move;

 Στα copy αντιγράφεις ενα αντικειμενο στο άλλο, στο move τι κανεις;  Το std::move δεν το χω ξαναδει.

Δημοσ.

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 (τα οποια ειναι παρα πολλα)

  • Like 1
Δημοσ.

Επίσης μία παρατήρηση, το 

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) );
}
  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...