2016-12-02 166 views
0

我試圖創建兩個簡單的類,但是由於某些原因,此代碼不能編譯。這是說我沒有參數調用point :: point,但是我唯一一次調用point :: point是在主函數中,並且我在那裏調用它。爲什麼這個構造函數調用另一個沒有參數?

調試時,我發現它是string_two_points的構造函數,它正在調用point的構造函數。

#include <iostream> 
#include <string> 
using namespace std; 
class point{ 
public: 
    int x; 
    int y; 
    point(int x, int y): x(x),y(y){}; 
    point(const point & c): x(c.x), y(c.y) {}; 
    }; 

class string_two_points{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc):type(type){ 
     x=xc; 
    }; 
    string_two_points(string type, point & xc, point & yc):type(type){ 
     x=xc; 
     y=yc; 
    }; 

}; 

int main(){ 
    point a = point(2,3); 
    point b = point(3,4); 
    string_two_points x = string_two_points(string("abc"),a,b); 
    return 0; 
} 
+0

'string_two_points'具有'點x;'作爲成員。所以當你構造一個'string_two_points'時,它會構造'x',它涉及到調用'x'的構造函數。 –

+0

您需要告訴我們編譯器投訴發生在哪裏。因爲你沒有明確編碼的原因通常會調用ctors。你展示了兩個點。編譯器可能已經提供了其他幾個,包括默認的ctor。 –

+0

@ DOUGLASO.MOEN編譯器不提供默認的構造函數,如果有用戶提供的構造函數 –

回答

2
string_two_points(string type, point & xc):type(type){ 

此構造函數不初始化point y,因此它的默認調用默認參數的構造函數point::point(不存在)初始化。

0

string_two_points的構造函數都嘗試調用point的默認構造函數xy,然後爲它們分配一些東西。
由於point()不作爲構造函數存在,所以失敗,正如編譯器正確提到的那樣。

0

由於類string_two_points有一個名爲xypoint成員的string_two_points任何初始化必須包括xy初始化。既然你沒有說明如何在車隊成員初始化列表初始化它們,編譯器會自動添加默認初始化,就好像你寫

string_two_points(string type, point & xc):type(type), x(), y() { 
    x=xc; 
}; 

注意x=xc;不是一個初始化,這是它後會發生的轉讓初始化完成。

+0

可以是值初始化可以有不同的行爲來默認初始化 –

0

由於string_two_points有兩個point類型的成員,並且在兩個構造函數中都沒有賦予默認值,編譯器需要初始化它們。爲了做到這一點,它試圖調用默認的無參數構造函數。由於這不存在,這會產生錯誤。

您可以修復,通過在每個構造初始化成員:

class string_two_points 
{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc) 
    : type(type), x(xc), y(0, 0) 
    { 
    }; 

    string_two_points(string type, point& xc, point& yc) 
    : type(type), x(xc), y(yc) 
    { 
    }; 
}; 
相關問題