ползване на чужд class
Как да се запише в кода изваждане между два обекта, като се ползва чуждия клас и дефинираната операция изваждане в него?
Как се вика в кода getLength()?
Vector2D vec1{3, 7}, vec2{-12, -9};
Vector2D distanceVector = vec1 - vec2; // Toва не ми се вижда да работи
***
Ето я дефиницията на класа Vector2D: //от задачата в JA3:
Vector2D(double x, double y) :
x(x),
y(y) {
}
Vector2D operator-(const Vector2D & other) const {
return Vector2D(this->x - other.x, this->y - other.y);
}
double getLength() const {
return sqrt(getLengthSq());
}
double getLengthSq() const {
return this->x * this->x + this->y * this->y;
}
Зравей,
Оператори се предефинират, така както искаме да работят за нашия клас с ключовата дум operator и след това вида оператор, като в метода казваме точно какво прави оператора. С++ ни позволява да предефинираме почти всички оператори, което ще накара оператора да прави това което ти искаш в твоя клас. Също така това което връща оператора зависи от това какво искаме да правим в този код ни връща нов обект, който е резултат от сбора на полетата на другите два обекта. В exam preparation, има и една задача (тази с имейлите) с решенията на Георги Георгиев, която връща булева стойност за това дали един обект е по-голям от другия, като ги сравнява по приоритет. Примера там е много ясно написан погледни го за да видиш как работи.
Това е константна референция, като по този начин метода не приема копия на двата обекта върху които работим, а ги получава по референция, така кода работи по-бързо защото не копира обектите. В този случай обектите са сравнително малки имат две double полета, но може да имаме и доста по обемни обекти или да имаме много на брой обекти. А const е за да не променим от някъде нещо и това да ни промени поведението на оператора (резултата от използването му).
Колегата добре е обяснил, само да допълня някои неща за const:
- const референциите за параметри, освен за performance, се правят защото много често функционалност от стандартната библиотека изисква оператори точно с параметри, които са константни референции. Примерно всеки клас, които има operator< може да се ползва в set или за ключ на map. Но това работи само ако параметрите са const референции - ако ги направиш нормални параметри, няма да се компилира ако се опитваш да ползваш класа като елемент на set или ключ на map (освен ако не подадеш допълнителен клас за определяне на подредба)
- const след един метод казва на компилатора, че този метод не трябва да променя полета на this обекта. Така ако без да искаш промениш някое поле в логиката на метода, компилаторът ще ти даде грешка. Има такава конвенция в C++ че всички методи, които нямат за цел да променят класа, трябва да имат const, хем за да се пазиш от грешки, хем защото е по-четимо. Тук също го има момента, че понякога се налага да са то такива методите (или операторите) заради изисквания на стандартната библиотека (примерно ако имаш const параметър, компилаторът няма да ти позволи да му извикал не-const метод)
Това между другото до някаква степен сме го обсъждали в предишното издание на курса, което беше по-детайлно, в една от лекциите за OOP - може да погледнеш там за повече обяснения и за повече примери :). Също там има показан още един синтаксис за дефиниране на оператори, който понякога се налага да ползваме вместо този с примера (примерно ако искаш директно да можеш да cout-неш един клас)
Поздрави,
Жоро
Благодаря! Да, предишното издание на курса е много ценно.