2013-03-02 83 views
2

我調用構造函數有多個參數

Triangle::Triangle() 
{ 
    A = NULL; 
    B = NULL; 
    C = NULL; 
} 
Triangle::Triangle(Point& X,Point& Y, Point& Z) 
{ 
    A = new Point; 
    *A = X; 
    B = new Point; 
    *B = Y; 
    C = new Point; 
    *C = Z; 
} 

and 

istream& operator>>(istream& in, Triangle& T) 
{ 
    Point X,Y,Z; 
    in>>X>>Y>>Z; 
    Triangle T(X,Y,Z); 
    return in; 
} 

哪裏點是定義與coordonates X和Y 一個點的另一個類,我不知道該怎麼稱呼與多個參數構造函數的重載函數。你可以幫我嗎?

+1

你使用類指針的指針並通過非const引用獲取構造函數參數的任何原因? – chris 2013-03-02 15:15:58

+0

您不應該在該函數中使用構造函數,而不是如果您通過引用傳入「Triangle」。 – Beta 2013-03-02 15:17:26

回答

3

這是你如何做到這一點:

Point px; 
Point py; 
Point pz; 
Triangle trig(px, py, pz); 

trig將是對象,它是Triangle類的一個實例,上面會調用3個參數的構造函數。

另一種方式是指針:

Triangle *pTrig = new Triangle(pX, pY, pZ); 

此外,我認爲,這將是更好的:

Triangle::Triangle() 
    : A(NULL), B(NULL), C(NULL) 
{ 
} 

Triangle::Triangle(const Point& X,const Point& Y, const Point& Z) 
: A(new Point(X)), B(new Point(Y)), C(new Point(Z)) 
{ 
} 

假設點有一個拷貝構造函數。

你想從operator>>函數內部調用它來更新參數T,但這不起作用,因爲你不能在已經構造的東西上調用構造函數。相反,你需要的是實現一個賦值操作符。請參閱http://en.wikipedia.org/wiki/Assignment_operator_%28C%2B%2B%29瞭解更多信息。

然後,你可以做T = Triangle(X,Y,Z);

爲了實現賦值運算符,你可以這樣做:

Triangle& Triangle::operator= (const Triangle& other) 
{ 
    if (this != &other) // protect against invalid self-assignment 
    { 
     if (A != NULL) delete A; 
     if (B != NULL) delete B; 
     if (C != NULL) delete C; 
     A = new Point(other.A); 
     B = new Point(other.B); 
     C = new Point(other.C); 
    } 
    return *this; 
} 

假設點有拷貝構造函數。爲了實現拷貝構造函數,請參閱http://en.wikipedia.org/wiki/Copy_constructor

拷貝構造函數如下所示,但你需要做的點:

Triangle& Triangle::Triangle(const Triangle& other) 
    : A(new Point(other.A)), B(new Point(other.B)), C(new Point(other.C)) 
{ 
} 
} 
+0

我試過並給了我「重新定義形式參數'T'」 – user2116010 2013-03-02 15:44:03

+0

啊......現在我明白了......您想在運算符>>函數中調用它。不......那不行。讓我更新我的答案。 – ruben2020 2013-03-02 15:49:44

+0

太棒了!它正在工作,你也完成了賦值運算符功能。大!非常感謝你! – user2116010 2013-03-02 16:08:47

0

前兩個構造函數是默認構造函數覆蓋。第三個函數是運算符重載,它重載了>>運算符。你只需要創建一個三角形類的對象如下:

Triangle tr(x,y,z); 

Triangle* tr = new Triangle(x,y,z); 

其中x,y和z是Point類的對象。順便說一句,正如您在運算符重載(第三個函數)中所看到的那樣,您已經創建了類Triangle(Triangle T(X,Y,Z);)的對象。

+0

是的,但運算符重載的參數是第一個構造函數,並且不會傳遞X,Y和Z的正確值 – user2116010 2013-03-02 15:38:54