Я пытаюсь создать небольшой класс, который создает «точки» и вычисляет расстояние между ними. Сначала я создаю два «точечных» -объекта, а затем передаю второй в качестве аргумента функции, содержащейся в первой точке. Это дает мне доступ к координатам второй точки, однако я не совсем понимаю, каким образом я должен получить координаты первой точки — той, которая получает вторую точку в виде аргумента. Я подумал, что это будет выглядеть примерно так, но, очевидно, нет:
class Punkt{ //"Punkt" = swedish for "dot"
private:
int x, y;
public:
//Konstruktor
Punkt(int firstX, int firstY): x(firstX), y(firstY){};
//Setters and getters
int getX(){return x;}
void setX(int newX){x = newX;}
int getY(){return y;}
void setY(int newY){y = newY;}
//Avstånd till annan punkt
double distance(Punkt annanPunkt);
};
#include "punkt.h"#include <cmath>
double distance(Punkt annanPunkt){ //"annanpunkt" = "other dot"return sqrt(pow((annanPunkt.getX() - self.getX), 2) +
pow((annanPunkt.getY() - self.getY, 2))
}
Прежде всего, вы заявили distance
как функция-член, поэтому ее определение должно быть в Punkt
объем:
double Punkt::distance(Punkt annanPunkt){
Во-вторых, вам, вероятно, не нужна копия аргумента. Пройти const
ссылка:
double Punkt::distance(const Punkt& annanPunkt){
Что касается доступа к вашим собственным членам данных в функции, вы можете получить к ним доступ по имени (x
или же y
):
annanPunkt.getX() - x), 2)
С другой стороны, this->x
, getX()
, this->getX()
и т.д. я нахожу с помощью this
везде слишком многословно.
Обратите внимание, что вам нужно будет сделать ваши геттеры const
хоть:
int getX() const {return x;}
или удалите их полностью: если у вас нет инвариантов для поддержки, может имеет смысл использовать публичные данные членов.
Примечание: я бы, наверное, сделал distance
функция, не являющаяся членом:
double distance(const Punkt& a, const Punkt& b);
Во-первых, определение функции должно уточнять имя, чтобы указать, что оно определяет функцию-член, а не отдельную функцию, не являющуюся членом:
double Punkt::distance(Punkt annanPunkt)
^^^^^^^
Внутри функции члены могут быть доступны напрямую (например, getX
) или через this
(например. this->getX
). Обратите внимание, что this
это указатель, следовательно ->
скорее, чем .
getX
это функция, поэтому вам нужно будет добавить ()
позвонить и получить значение.
Наконец, вам нужно позаботиться о том, чтобы паратезы были в нужном месте, и завершите утверждение ;
Собрав все это вместе, это должно работать:
double Punkt::distance(Punkt annanPunkt){
return sqrt(pow(annanPunkt.getX() - this->getX(), 2) +
pow(annanPunkt.getY() - this->getY(), 2));
}
Вы можете удалить this->
или даже доступ x
а также y
напрямую, если вам нравится краткость.
В C ++ в функции члена класса у вас есть доступ ко всем членам класса:
double Punkt::distance( Punkt annanPunkt) {
// ^ note: distance is member function of Punkt class
return sqrt( pow( ( annanPunkt.getX() - x), 2) +
// ^ this object x coordinate
pow( ( annanPunkt.getY() - y, 2))
// ^ this object y coordinate
}
C ++ не имеет self
но this
и в методах вы можете ссылаться на члены без какого-либо дополнительного синтаксиса, поэтому вы можете использовать:
double distance(Punkt annanPunkt){ //"annanpunkt" = "other dot"return sqrt(pow((annanPunkt.getX() - getX()), 2) +
pow((annanPunkt.getY() - getY(), 2))
}