2011-03-26 161 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 &); 

因此编译器不提供一个默认的构造函数。