функция — использовать переменную из собственного переполнения стека

Я пытаюсь создать небольшой класс, который создает «точки» и вычисляет расстояние между ними. Сначала я создаю два «точечных» -объекта, а затем передаю второй в качестве аргумента функции, содержащейся в первой точке. Это дает мне доступ к координатам второй точки, однако я не совсем понимаю, каким образом я должен получить координаты первой точки — той, которая получает вторую точку в виде аргумента. Я подумал, что это будет выглядеть примерно так, но, очевидно, нет:

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))
}

1

Решение

Прежде всего, вы заявили 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);
4

Другие решения

Во-первых, определение функции должно уточнять имя, чтобы указать, что оно определяет функцию-член, а не отдельную функцию, не являющуюся членом:

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 напрямую, если вам нравится краткость.

1

В 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
}
0

C ++ не имеет self но thisи в методах вы можете ссылаться на члены без какого-либо дополнительного синтаксиса, поэтому вы можете использовать:

double distance(Punkt annanPunkt){ //"annanpunkt" = "other dot"return sqrt(pow((annanPunkt.getX() - getX()), 2) +
pow((annanPunkt.getY() - getY(), 2))
}
0
По вопросам рекламы [email protected]