對於作業分配,我們被要求創建兩個類:一個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類作業指令,書上說創造
和
「返回Z值恆定get函數」「A常數distance(const MyPoint&)
函數返回之間的距離這點和三維空間中的其他點。「
我的問題是「常量獲取函數...」和「恆定距離(const MyPoint &)函數...」是什麼意思?我知道你可以在函數聲明後加const
來防止函數改變任何類的成員,但爲什麼在這裏這是必要的?
此外,爲什麼我會將const MyPoint&
傳遞給距離函數而不是ThreeDPoint對象?畢竟,我們試圖找到兩個ThreeDPoints之間的距離。我讀過,如果你在成員函數聲明中有一個父對象參數,那麼這個父對象的任何子對象也可以傳遞給該函數,所以也許這與它有關。
最後,是不是distance(const MyPoint&)
在說明中缺少MyPoint &對象的名稱?我確實嘗試輸入這個,編譯器不介意,但我將如何訪問被傳入的對象的成員?
編輯:此外,&服務的目的是什麼?
最重要的是,我將如何重新編寫我的代碼以完全遵循指令的狀態?
感謝您的閱讀並感謝任何人的建議。
相當不錯 - 只需添加幾件事。一種是通過引用傳遞而不是通過值傳遞是一個很好的想法,當你傳遞大量數據結構時,因爲通過值傳遞會創建一個可能很昂貴的對象的副本。 NEVERMIND你只是編輯了這麼一個東西:在頭文件中將函數聲明爲'distance(const MyPoint&)',然後在cpp文件中將它定義爲'distance(const MyPoint&point)'是完全合法的 - 編譯器仍然會找到正確的功能鏈接到定義=)它很奇怪,但它是可行的。 –
@CommanderCorianderSalamander是的,但在這個例子中只有一個頭文件和沒有實現文件,所以我故意留下了這個細節。 – zneak
@zneak:感謝您的建議。我仍然可以編寫一個單獨的實現文件;這些細節未在說明中指定。 – navig8tr