2013-12-09 7 views
-1

Для задания домашней работы нам предлагается создать два класса: класс 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 &? Я попытался ввести это, и компилятор не против, но как мне получить доступ к членам передаваемого объекта?

Редактировать: Также, какая цель служит &?

Самое главное, как бы мне написать свой код, чтобы точно следовать инструкциям?

Спасибо за чтение и благодарю вас за любые предложения, которые могут быть у кого-либо.

ответ

3

Если вы живете в мире, где нет const объектов, это никогда не необходимо помечать методы const. Однако это хорошая идея. Использование указателей и ссылок const - очень хорошая практика, когда вам не нужно менять членов объекта, и это может помочь вам найти недостатки дизайна, когда ваша программа становится больше.

Также рекомендуется передавать ссылки на объекты, поскольку передача ссылки обычно выполняется быстрее, чем передача копии объекта. (Также в этом контексте вы будете использовать ссылки const: он сообщает вызывающему, что вы хотите, чтобы объект по ссылке, потому что он быстрее, а не потому, что вы хотите его изменить.)

Это законно опускать имена аргументов, но это имеет очевидное следствие, что вы не сможете использовать их в своей функции. Это также общая нотация, потому что компиляторы избавляются от имен аргументов, когда они создают сигнатуры функций, поэтому вы часто увидите сообщения об ошибках, которые выглядят как distance(const MyPoint&), а не distance(const MyPoint& point).

Я не могу вам помочь, почему они хотят const MyPoint& для класса ThreeDPoint. Мое лучшее предположение состоит в том, что они хотят, чтобы вы предположили, что компонент z этой точки равен 0.

+0

Довольно хорошо - всего пару штук. Одно - передача по ссылке вместо передачи по значению - хорошая идея, когда вы передаете большие структуры данных, так как при передаче по значению создается копия объекта, которая может быть дорогостоящей. NEVERMIND YOU JUST EDITED THAT В этом случае еще одна вещь: полностью законно объявлять функцию в заголовке как «distance (const MyPoint &)», а затем определять ее в файле cpp как «distance (const MyPoint & point)» - компилятор все равно найдет нужную функцию для ссылки на определение =), это странно, но это выполнимо. –

+0

@CommanderCorianderSalamander Да, но в этом случае есть только заголовочный файл и файл реализации, поэтому я оставил эту деталь специально. – zneak

+1

@zneak: Спасибо за предложения. Я все еще мог написать отдельный файл реализации; эта информация не указана в инструкциях. – navig8tr

Смежные вопросы