2014-04-11 126 views
0
class root 
{ 
    string name; 
    public: 
    root(); 
    root(string Name) 
    { 
     Name=name; 
    } 
    ~root(); 
    void setName(string Name) 
    { 
     name=Name; 
    } 

    string getName() 
    { 
     return name; 
    } 
}; 

int main() 
{ 
    string name("name"); 
    root Root(name); 
    Root.setName("name"); 
    cout<<Root.getName(); 
} 

然後我的程序運行順利,但爲什麼不會我的程序運行,如果我有這可能會出現什麼問題?

root Root; //this had to be legal, right? 

而且,我爲什麼還要

root Root(name); //declaring? 

,並再次

root setName(name); 

是不是必須使用:

root Root; //?? 
+2

你沒有一個機構爲默認構造函數:'根(){}' –

+0

考慮宣佈'根(字符串名稱)'作爲'explicit'。 –

回答

1
  1. 添加到您的root()構造函數體{}
  2. 修正你root(string Name)構造。它應該是:

root(string Name) 
{ 
    name=Name; // <--- notice reversed order. 
} 

如果我建議,你可以使用const&參考,而不是:

root(const string& Name) 
{ 
    name=Name; 
} 
+0

如果我使用參考書更好嗎? – Rockink

+0

理論上,具有適當優化的編譯器應該看到你不需要複製'string'類型的對象,並且會使用引用,但有時候優化可能無法很好地工作,所以編寫'const type&variable'是一個確保你只願意參考,而不會改變它。 – Grzegorz

+2

或者更好的是'root(const string&Name):name(Name){}'。 –

1

在你的類描述中,你聲明瞭root(),但是你沒有提供該函數的定義。

所以當你做root Root你試圖調用一個不存在的默認構造函數。

+0

也許值得指出的是代碼應該編譯爲目標代碼,但不應該鏈接 - 缺少的函數是鏈接器錯誤而不是編譯器錯誤。 –

1

爲什麼不會我的程序運行,如果我有

root Root; //this had to be legal, right? 

你宣佈,但從來沒有定義構造函數Root()

此外,

root(string Name) 
{ 
    Name=name; 
} 

哎呦。您分配給函數本地參數,而不是類成員。

+0

這是使用構造函數初始值設定項列表的另一個原因。 – chris