我需要关于班级建设的帮助。在我的课程中,我使用了复制构造函数和operator =来阻止编译器创建它们。在我的主程序中,当我尝试创建类的实例时,我收到一条错误,上面写着“该类没有默认的构造函数”。
可能是什么问题?
这是我的代码片段。
class netlist {
netlist(const netlist &);
netlist &operator=(const netlist &);
std::map<std::string, net *> nets_;
}; // class netlist
在我使用的主要功能中:
netlist nl;
这是我收到错误的地方。我提供了复制构造函数声明,所以它们应该不是问题。
我将不胜感激任何帮助。提前谢谢。
答案 0 :(得分:6)
创建网表时,您没有将任何参数传递给构造函数,这意味着您正在调用默认构造函数。但是,您没有定义默认构造函数。您只创建了一个构造函数,在此处将不同的网表作为参数(复制构造函数):
netlist(const netlist &);
您应该定义一个默认构造函数:
netlist();
请注意,如果您没有定义任何构造函数,编译器会添加默认构造函数,但由于您添加了复制构造函数,因此您必须自己定义所有构造函数。
答案 1 :(得分:6)
代码存在两个问题 -
"I get an error saying "No default constructor exists for the class" ".
因为如果提供任何类型的构造函数作为类声明的一部分(在这种情况下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 &);
因此编译器不提供默认构造函数。