2012-05-21 147 views
3

所以我寫了一些C++今天,一個簡單的座標系統長時間的休息之後,我想我會希望有一個構造方法來在2個值,這樣我可以寫的東西,如「座標C =新座標(1 ,2);」C++構造函數的參數

struct Coordinates { 
    int x; 
    int y; 

    Coordinates(int a, int b) { 
     x = a; 
     y = b; 
    } 
}; 

當Cygwin中編譯,我得到:

$ g++ -o adventure adventure.cpp adventure.cpp:36: error: no matching function for call to `Coordinates::Coordinates()' adventure.cpp:22: note: candidates are: Coordinates::Coordinates(const Coordinates&) adventure.cpp:26: note: Coordinates::Coordinates(int, int)

不知道發生了什麼事情錯在這裏,我無法找到C++結構構造多的信息。有任何想法嗎?

+0

你能粘貼代碼,給出了錯誤的行?是否像「座標c」一樣?如果是這樣,那是不合法的,因爲如果沒有兩個整數參數或另一個「座標」,你就沒有辦法構建'Coordinates'。 –

+1

您試圖默認構造座標對象。有一個如果你想要的對象是默認constructible。 – Jagannath

+1

座標c =新座標(1,2);這是錯誤的。應該是座標* c =新的座標(1,2); – Jagannath

回答

8

在代碼中的第36行(你沒有顯示)要創建這個類的一個對象,但你不傳遞任何參數的構造函數。唯一有效的構造函數是帶有兩個整數的構造函數,或者默認的複製構造函數。可以添加一個無參數的構造函數,也可以更改代碼以將ab傳遞給構造函數。

+0

你說得對。 '座標currentPos';'在結構聲明下面的全局範圍內,我試圖在由main函數調用的init()方法中初始化currentPos,但是像這樣寫它將需要一個無參數的構造函數。感謝Jagannath的建議,我意識到如何保持一切順利。我將它改爲'Coordinates * currentPos'並在以後正確地初始化它。 – Polygonica

4

通過寫一個明確的構造函數,你禁用了自動創建一個默認的構造,這是定義對象時,沒有構造函數的參數,如Coordinates coords;使用。你必須明確地提供這樣的:

struct Coordinates { 
    int x; 
    int y; 

    Coordinates(int a, int b) { 
    x = a; 
    y = b; 
    } 

    Coordinates(): x(0), y(0) {} 
}; 

請注意,我在初始化默認的構造函數的成員變量;它不是強制性的,但它是一個好主意,否則即使在它們將被編譯器生成的構造默認初始化的情況下,它們也是未定義的。

另外請注意,我使用的成員初始化(在: x(0), y(0)部分),而不是分配在構造體。這是很好的風格,因爲類對象通常會提供更好的性能,並且在某些情況下是初始化成員的唯一方法(例如,如果它是const類型或沒有默認構造函數)。

注意,在C++ 11,你可以告訴編譯器生成,它會沒有其他構造函數產生相同的默認構造函數,通過只在類定義寫

Coordinates() = default;