2013-12-09 132 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類作業指令,書上說創造

「返回Z值恆定get函數」「A常數distance(const MyPoint&)函數返回之間的距離這點和三維空間中的其他點。「

我的問題是「常量獲取函數...」和「恆定距離(const MyPoint &)函數...」是什麼意思?我知道你可以在函數聲明後加const來防止函數改變任何類的成員,但爲什麼在這裏這是必要的?

此外,爲什麼我會將const MyPoint&傳遞給距離函數而不是ThreeDPoint對象?畢竟,我們試圖找到兩個ThreeDPoints之間的距離。我讀過,如果你在成員函數聲明中有一個父對象參數,那麼這個父對象的任何子對象也可以傳遞給該函數,所以也許這與它有關。

最後,是不是distance(const MyPoint&)在說明中缺少MyPoint &對象的名稱?我確實嘗試輸入這個,編譯器不介意,但我將如何訪問被傳入的對象的成員?

編輯:此外,&服務的目的是什麼?

最重要的是,我將如何重新編寫我的代碼以完全遵循指令的狀態?

感謝您的閱讀並感謝任何人的建議。

回答

3

如果你生活在一個世界裏,沒有const對象,它從來沒有必要標記方法const。但是,這是一個好主意。當您不需要更改對象的成員時,使用const指針和引用是非常好的做法,它可以幫助您在程序變大時發現設計缺陷。

將對象的引用傳遞給對象也是一種很好的做法,因爲傳遞引用通常比傳遞對象的副本要快。 (在這種情況下,您將使用const引用:它通過引用告訴調用方您想要對象,因爲它更快,而不是因爲您想要更改它。)

省略參數名稱是合法的,但它具有明顯的後果,即您將無法在函數中使用它們。這也是一種常用符號,因爲編譯器在創建函數簽名時會刪除參數名稱,所以您經常會看到類似distance(const MyPoint&)而不是distance(const MyPoint& point)的錯誤消息。

我無法幫助你爲什麼他們想要爲爲ThreeDPoint類。我最好的猜測是,他們希望你假設該點的z組成部分爲0.

+0

相當不錯 - 只需添加幾件事。一種是通過引用傳遞而不是通過值傳遞是一個很好的想法,當你傳遞大量數據結構時,因爲通過值傳遞會創建一個可能很昂貴的對象的副本。 NEVERMIND你只是編輯了這麼一個東西:在頭文件中將函數聲明爲'distance(const MyPoint&)',然後在cpp文件中將它定義爲'distance(const MyPoint&point)'是完全合法的 - 編譯器仍然會找到正確的功能鏈接到定義=)它很奇怪,但它是可行的。 –

+0

@CommanderCorianderSalamander是的,但在這個例子中只有一個頭文件和沒有實現文件,所以我故意留下了這個細節。 – zneak

+1

@zneak:感謝您的建議。我仍然可以編寫一個單獨的實現文件;這些細節未在說明中指定。 – navig8tr