2011-03-26 196 views
2

我需要關於類構造的幫助。在我的課上,我使用了一個拷貝構造函數和operator =來防止編譯器創建它們。在我的主程序中,當我嘗試創建該類的實例時,出現錯誤,提示「該類沒有默認構造函數」。默認構造函數C++錯誤

可能是什麼問題?

這是我的代碼片段。

class netlist { 
    netlist(const netlist &); 
    netlist &operator=(const netlist &); 
    std::map<std::string, net *> nets_; 
}; // class netlist 

在我的主要功能,我使用:

netlist nl; 

這是我的錯誤。我提供了複製構造函數聲明,所以它們不應該是一個問題。

我將不勝感激任何幫助。提前致謝。

+0

此問題揭示了使用不可複製和不可分配基類的另一個優點:不會禁止創建隱式默認構造函數。 http://codepad.org/qejKEQoW – UncleBens 2011-03-26 12:41:28

回答

6

有兩個問題與代碼 -

  1. 類成員默認都是私人
  2. "I get an error saying "No default constructor exists for the class" ".

因爲如果任何一種構造是作爲類聲明的一部分提供(netlist類在這種情況下,一個拷貝構造函數),默認的構造函數(即不帶參數的構造函數)不提供編譯器。

netlist nl; // And this invokes call to the default constructor and so 
      // the error 

netlist.h

class netlist { 

public: // Added 
    netlist(); // This just a declaration. Should provide the definition. 
    netlist(const netlist &); 
    netlist &operator=(const netlist &); 
    std::map<std::string, net *> nets_; 
}; // class netlist 

netlist.cpp

netlist::netlist() 
{ 
     // ..... 
} 

// Other definitions 
+0

非常感謝Mahesh的幫助!我以前不知道這一點。現在我明白了。 – Sista 2011-03-26 21:35:03

6

當您創建網表時,您沒有將任何參數傳遞給構造函數,這意味着您正在調用默認構造函數。但是你沒有定義一個默認的構造函數。您只需創建一個構造採取了不同的網表作爲參數(拷貝構造函數)位置:

netlist(const netlist &); 

,應定義默認構造函數是這樣的:

netlist(); 

指出,如果你沒有定義任何構造函數,編譯器會添加默認的,但是由於您添加了複製構造函數,所以您必須自己定義所有這些構造函數。

+0

但是,如果沒有提供,編譯器是否會生成一個默認構造函數? – Cameron 2011-03-26 03:19:05

+0

謝謝....但如果我這樣做,我得到這個錯誤:> main.obj:錯誤LNK2019:無法解析的外部符號「public:__thiscall netlist :: netlist(void)」(?? 0netlist @@ QAE @ XZ)在函數中引用_main – Sista 2011-03-26 03:20:46

+1

@sista - 這是因爲您沒有提供默認構造函數的定義。它是一個鏈接器錯誤,這意味着沒有找到定義。 – Mahesh 2011-03-26 03:22:02

0

標準的第[class.ctor]說(措詞從草案n3242):

A default constructor for a class X is a constructor of class X that can be called without an argument. If there is no user-declared constructor for class X , a constructor having no parameters is implicitly declared as defaulted (8.4). An implicitly-declared default constructor is an inline public member of its class.

你有一個用戶聲明的構造:

netlist(const netlist &); 

因此編譯器不提供一個默認的構造函數。