2012-01-09 50 views
0

我剛剛完成創建一個「Point」類,並且正在使用具有兩個Point對象(Point startpoint和Point endpoint)作爲數據成員的「Line」類。我在接受兩個Point對象作爲參數,並如下最初創建它我行類創建一個構造函數:爲什麼我不能在這裏使用成員初始化列表?

Line(const Point& p1, const Point& p2) 
{ 
    startpoint = p1; 
    endpoint = p2; 
} 

一切都很好,但後來我決定,我會用一個成員初始化列表,而不是分配給成員以p1和p2在身上,只是因爲......但是,當我把它改爲:

Line(const Point& p1, const Point& p2): startpoint(p1), endpoint(p2) 
{ 
} 

我得到一個錯誤說「沒有構造的情況下‘點::點’相匹配的參數列表」和沒不明白這意味着什麼。

爲什麼成員初始化列表不能在這裏工作?

謝謝。

編輯:對不起,我不知道如果我的點類的細節是相關或不:

// Point.h

class Point 
{ 
private: 
    double x; 
    double y; 

public: 
    Point(); 
    Point(Point& p); 
    Point(double x1, double y1); 
    ~Point(); 

    double X() const; 
    double Y() const; 

    void X(double newx); 
    void Y(double newy); 
    }; 

// Point.cpp

#include "Point.h" 

Point::Point(): x(0), y(0) 
{ 
} 

Point::Point(Point& p) 
{ 
    x = p.x; 
    y = p.y; 
} 

Point::Point(double x1, double y1): x(x1), y(y1) 
{ 
} 

Point::~Point() 
{ 
} 

double Point::X() const 
{ 
    return x; 
} 

double Point::Y() const 
{ 
    return y; 
} 

void Point::X(double newx) 
{ 
    x = newx; 
} 

void Point::Y(double newy) 
{ 
    y = newy; 
} 
+8

向我們展示您的點類可能會有所幫助 – Grizzly 2012-01-09 17:47:15

+2

這意味着Point類的複製構造函數可能會出錯。 – ybungalobill 2012-01-09 17:48:29

+1

爲了將來的參考,不是'const'的東西可以隱式轉換爲const的東西,但是const的東西不能隱式轉換成不是的東西,這是你在這裏遇到的問題 – 2012-01-09 18:19:30

回答

10

成員初始化取決於具有公共複製構造函數的Point,因爲您明確地調用了Point::Point(const Point&)

如果不存在或無法訪問,則無法調用它。如果你不能調用它,那不是因爲初始化列表不起作用。

假設Point有一個可訪問的賦值運算符,如果第一個版本有效。


只是爲了確認,現在你已經粘貼了Point源,拷貝構造函數應該是這樣的:

Point::Point(const Point &other) : x(other.x), y(other.y) {} 

(你可以使用初始化列表以及獲得舒適)。 關鍵更改是參數必須是const參考:這樣可以防止複製時意外損壞源對象。

+5

他可能聲明瞭一個拷貝構造函數,但是將參數作爲'Point&'而不是'const Point&' – 2012-01-09 17:53:28

+0

由粘貼代碼確認;好的(受過教育的)猜測 – Useless 2012-01-09 18:11:46

3

Line(const Point& p1, const Point& p2): startpoint(p1), endpoint(p2) 

要調用Point::Pointp1p2分別),其類型爲const Point&,即你承諾不會改變給Line::Line參數。現在,我們來看看你的Point課程。與參數的匹配數量的唯一方法是

Point(Point& p); 

這需要一個Point&,東西是好內部Point::Point(Point&)修改。因此,您不能通過p1(或p2),因爲您已經承諾它永遠不會被更改。

讓你的構造

Point(const Point& p); 

和像你這樣,你可以使用初始化器列表。

0
Point(Point& p); 

你拷貝構造函數需要一個非const參照Point。這意味着您無法初始化const引用中的一個點,初始化列表需要該點。賦值是有效的,因爲你還沒有實現你自己的複製賦值操作符,因此使用了隱式賦值操作符。

您應該將複製構造函數更改爲Point(Point const &);,或者更好的是將其完全移除,因爲它與隱式定義的完全相同。同樣,定義自己的析構函數也沒有意義,除非它需要做某件事,或者需要虛擬或非公開。

相關問題