Для задания домашней работы нам предлагается создать два класса: класс MyPoint и класс ThreeDPoint.C++ Передача объекта функции-члена
Вот мой MyPoint класс:
#pragma once
#include <math.h>
class MyPoint
{
private:
double x, y;
public:
MyPoint()
{
x = y = 0;
}
MyPoint(double x, double y)
{
this->x = x;
this->y = y;
}
double getX()
{
return x;
}
double getY()
{
return y;
}
double distance(MyPoint pointB)
{
return sqrt((x - pointB.x) * (x - pointB.x)
+ (y - pointB.y) * (y - pointB.y));
}
};
Вот мой ThreeDPoint класс:
#pragma once
#include "MyPoint.h"
class ThreeDPoint : public MyPoint
{
private:
double z;
public:
ThreeDPoint() // : MyPoint()
{
z = 0;
}
ThreeDPoint(double x, double y, double z) : MyPoint(x, y)
{
this->z = z;
}
double getZ()
{
return z;
}
double distance(ThreeDPoint pointB) // function overloading
{
// x and y are private not protected
return sqrt((getX() - pointB.getX()) * (getX() - pointB.getX())
+ (getY() - pointB.getY()) * (getY() - pointB.getY())
+ (getZ() - pointB.getZ()) * (getZ() - pointB.getZ()));
}
};
А вот главная:
#include <iostream>
#include "SignatureBlock.h"
#include "MyPoint.h"
#include "ThreeDPoint.h"
int main()
{
SignatureBlock myBlock;
std::cout << myBlock.toString();
MyPoint pointA(1, 2);
MyPoint pointB(4, 2.5);
std::cout << pointA.distance(pointB) << '\n';
ThreeDPoint point_a(0, 0, 0);
ThreeDPoint point_b(10, 30, 25.5);
std::cout << point_a.distance(point_b) << '\n';
return 0;
}
Этот код работает отлично. Он способен вычислять расстояние между двумя точками как в двумерном, так и в трехмерном пространстве. Однако в инструкции домашних заданий для класса ThreeDPoint, говорится в книге, чтобы создать
«постоянной функции ПОЛУЧИТЬ, которая возвращает значение г»
и
«Константа distance(const MyPoint&)
функции возвращает расстояние между эта точка и другая точка в трехмерном пространстве ».
Мой вопрос: что они означают под «Постоянная функция получения ...» и «Постоянное расстояние (const MyPoint &) function ...»? Я понимаю, что после объявления функции вы можете поставить const
, чтобы функция не меняла каких-либо членов класса, но почему это необходимо здесь?
Кроме того, почему я должен передать const MyPoint&
функции расстояния, а не объекта ThreeDPoint? В конце концов, мы пытаемся найти расстояние между двумя ThreeDPoints. Я читал, что если у вас есть параметр родительского объекта в объявлении функции-члена, любой ребенок этого родителя также может быть передан функции, поэтому, возможно, это имеет к этому какое-то отношение.
И, наконец, не является ли distance(const MyPoint&)
в инструкциях, не имеющих названия для объекта MyPoint &? Я попытался ввести это, и компилятор не против, но как мне получить доступ к членам передаваемого объекта?
Редактировать: Также, какая цель служит &?
Самое главное, как бы мне написать свой код, чтобы точно следовать инструкциям?
Спасибо за чтение и благодарю вас за любые предложения, которые могут быть у кого-либо.
Довольно хорошо - всего пару штук. Одно - передача по ссылке вместо передачи по значению - хорошая идея, когда вы передаете большие структуры данных, так как при передаче по значению создается копия объекта, которая может быть дорогостоящей. NEVERMIND YOU JUST EDITED THAT В этом случае еще одна вещь: полностью законно объявлять функцию в заголовке как «distance (const MyPoint &)», а затем определять ее в файле cpp как «distance (const MyPoint & point)» - компилятор все равно найдет нужную функцию для ссылки на определение =), это странно, но это выполнимо. –
@CommanderCorianderSalamander Да, но в этом случае есть только заголовочный файл и файл реализации, поэтому я оставил эту деталь специально. – zneak
@zneak: Спасибо за предложения. Я все еще мог написать отдельный файл реализации; эта информация не указана в инструкциях. – navig8tr