默认构造函数C ++错误

时间:2011-03-26 03:14:51

标签: c++ constructor

我需要关于班级建设的帮助。在我的课程中,我使用了复制构造函数和operator =来阻止编译器创建它们。在我的主程序中,当我尝试创建类的实例时,我收到一条错误,上面写着“该类没有默认的构造函数”。

可能是什么问题?

这是我的代码片段。

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

在我使用的主要功能中:

netlist nl;

这是我收到错误的地方。我提供了复制构造函数声明,所以它们应该不是问题。

我将不胜感激任何帮助。提前谢谢。

3 个答案:

答案 0 :(得分:6)

创建网表时,您没有将任何参数传递给构造函数,这意味着您正在调用默认构造函数。但是,您没有定义默认构造函数。您只创建了一个构造函数,在此处将不同的网表作为参数(复制构造函数):

netlist(const netlist &);

您应该定义一个默认构造函数:

netlist();

请注意,如果您没有定义任何构造函数,编译器会添加默认构造函数,但由于您添加了复制构造函数,因此您必须自己定义所有构造函数。

答案 1 :(得分:6)

代码存在两个问题 -

  1. 默认情况下,班级成员私有
  2. "I get an error saying "No default constructor exists for the class" ".
  3. 因为如果提供任何类型的构造函数作为类声明的一部分(在这种情况下netlist类具有复制构造函数),编译器不提供默认构造函数(即,没有参数的构造函数)。 / p>

    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
    

答案 2 :(得分:0)

该标准的[class.ctor]部分(来自n3242草案的措辞):

  

X默认构造函数是类X的构造函数,可以在不带参数的情况下调用。如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。隐式声明的默认构造函数是其类的inline public成员。

您有一个用户声明的构造函数:

netlist(const netlist &);

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