Софтуерно Инженерство
Loading...
+ Нов въпрос
Jovanna avatar Jovanna 184 Точки

ползване на чужд 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;
    }

Тагове:
0
C++ Fundamentals
MartinBG avatar MartinBG 1215 Точки

За да бъдат използвани външни класове, те трябва първо да бъдат обявени:

#include "Vector2D.h"

Виж в тази задача как е използван BigInt.h.

1
11/01/2018 21:21:53
AlucardDracula avatar AlucardDracula 403 Точки

не съм запознат със C++ много, но тъй като е ООП език, при C# след класа с Main() метода трябва да сложиш и другия клас поне при Programming Basics ето така:

public class A
{
   public static Main()
   {
      // главната логика...
   {
}
public class B
{
   // методи, променливи и др. които можеш да използваш от класа А
}

 

1
MartinPaunov avatar MartinPaunov 77 Точки

Здравей,

Преди всичко за да използваш другия клас, който е написан в друг файлтрябва да си добавиш следния код: #include "Vector2D.h". Казано иначе да си #include-неш класа, както се прави и с vector - когао искаш да използваш неговите функционалности. Иначе като цяло това с изваждането би следвало да ти работи, ако изваждаш два обекта, като резултата връща нов обект. Създаването на нов обект чрез изваждане на два предварително създадени обекта ще работи при мен работи както с оператора = така и без него например:

Vector2D curnetVector(vec1 - vec2); В С++11 работи и Vector2D curnetVector{vec1 - vec2};

getLength() и getLengthSq() се достъпват по обикновения начин за достъпване на публични членове на един клас, а именно currentVector.getLength(); (името на обекта, последвано от "." и името на публичния член в случая метода).

Ако съхраняваш обектите в някакъв асоциативен контейнер провери дали коректно достъпваш обекта, а не нещо друго от контейнера.

Поздрави

  

2
KrumBumbarov avatar KrumBumbarov 3 Точки

Здравей!

Както е споменал Мартин, за да създаваш обекти от класа Vector2D, първо трябва да include - неш файла Vector2D.h чрез 
#include "Vector2D.h" 
Само че, за да го достъпиш по този начин, то файлът Vector2D.h трябва да се намира в същата директория, където се намира и файлът, в който задаваш тази операция!
Веднъж щом Vector2D.h е вмъкнат, то можеш да използваш всичко от него така все едно, че кодът от него е вмъкнат директно в твоя файл.

Според мен statement-ът 
Vector2D distanceVector = vec1 - vec2;
иглежда коректен, но за да намериш разстоянието м/у точките vec1 и vec2 трябва да вземеш ст-стта, която ще получиш след изпълнението на метода getLength():
т.е. разстоянието м/у точките vec1 и vec2 може да се вземе директно по следния начин:
double currentDistance = (vec1 - vec2).getLength();
Разбира се може и така : currentDistance = distanceVector.getLength();

* Ако имаш 2 точки в двумерното пространство : p1(x1, y1) и p2(x2, y2), то разстоянието м/у тях е
sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2)

Надявам се, че отговорът ми ти е бил полезен!
Поздрави, Крум!

2
12/01/2018 05:45:26
Jovanna avatar Jovanna 184 Точки

Йей, кодът тръгна с чуждия клас!! Много благодаря на всички!!!

А как се дефинират оператори +, -, <, > и т.н. в собствен клас, какви са правилата?

Примерно , тук защо се налага да е const, и защо се взема по референция other, или това не е референция?

 Vector2D operator+(const Vector2D & other) const {
        return Vector2D(this->x + other.x, this->y + other.y);
    }

0
MartinPaunov avatar MartinPaunov 77 Точки

Зравей,

Оператори се предефинират, така както искаме да работят за нашия клас с ключовата дум operator и след това вида оператор, като в метода казваме точно какво прави оператора. С++ ни позволява да предефинираме почти всички оператори, което ще накара оператора да прави това което ти искаш в твоя клас. Също така това което връща оператора зависи от това какво искаме да правим в този код ни връща нов обект, който е резултат от сбора на полетата на другите два обекта. В exam preparation, има и една задача (тази с имейлите) с решенията на Георги Георгиев, която връща  булева стойност за това дали един обект е по-голям от другия, като ги сравнява по приоритет. Примера там е много ясно написан погледни го за да видиш как работи.

Това е константна референция, като по този начин метода не приема копия на двата обекта върху които работим, а ги получава по референция, така кода работи по-бързо защото не копира обектите. В този случай обектите са сравнително малки имат две double полета, но може да имаме и доста по обемни обекти или да имаме много на брой обекти. А const е за да не променим от някъде нещо и това да ни промени поведението на оператора (резултата от използването му).

2
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Колегата добре е обяснил, само да допълня някои неща за const:

- const референциите за параметри, освен за performance, се правят защото много често функционалност от стандартната библиотека изисква оператори точно с параметри, които са константни референции. Примерно всеки клас, които има operator< може да се ползва в set или за ключ на map. Но това работи само ако параметрите са const референции - ако ги направиш нормални параметри, няма да се компилира ако се опитваш да ползваш класа като елемент на set или ключ на map (освен ако не подадеш допълнителен клас за определяне на подредба)

- const след един метод казва на компилатора, че този метод не трябва да променя полета на this обекта. Така ако без да искаш промениш някое поле в логиката на метода, компилаторът ще ти даде грешка. Има такава конвенция в C++ че всички методи, които нямат за цел да променят класа, трябва да имат const, хем за да се пазиш от грешки, хем защото е по-четимо. Тук също го има момента, че понякога се налага да са то такива методите (или операторите) заради изисквания на стандартната библиотека (примерно ако имаш const параметър, компилаторът няма да ти позволи да му извикал не-const метод)

Това между другото до някаква степен сме го обсъждали в предишното издание на курса, което беше по-детайлно, в една от лекциите за OOP - може да погледнеш там за повече обяснения и за повече примери :). Също там има показан още един синтаксис за дефиниране на оператори, който понякога се налага да ползваме вместо този с примера (примерно ако искаш директно да можеш да cout-неш един клас)

 

Поздрави,

Жоро

2
Jovanna avatar Jovanna 184 Точки

Благодаря! Да, предишното издание на курса е много ценно. 

0
Jovanna avatar Jovanna 184 Точки

Благодаря! Вече е по ясно.

1