结构体中的易错点
作为一名蒟蒻,我常常在各种各样的编程问题上磕磕绊绊。今天又是这样。
问题 I
大致就是当我声明了一个结构体edge,然后又自定义了一个构造函数edge(int …)(带参的),然后。。。我想要声明一个edge的数组,编译器却一直在报错:
(部分代码如下)
typedef struct edge{
int n,u,v,l;
edge(int n,int u,int v,int l){
this->n=n;
this->u=u;
this->v=v;
this->l=l;
}
}edge;
edge e[maxn];
(编译器报错如下)
[Error] no matching function for call to ‘edge::edge()’
然后我就调啊调,最后在网上找到了一篇文章,终于解决了我的问题,下面我就来分享一下
解决方案
定义结构体数组要有默认构造函数才行,如果你没有定义构造函数,那编译器就会自动给你生成一个,但只要你定义了构造函数,编译器就不再帮你生成了,所以你的错误是没有默认构造函数,要改的话,给你上面那个构造函数的参数全部加上缺省值就可以了————来自某好心人
这个的意思是我还应该再编写一个无参构造函数,因为原来的那个被我重载掉了。。。
加上下面这一段代码就好了(在结构体内部加入):
edge():n(0),u(0),v(0),l(0){}
于是这个问题就这样过去了
问题 II
后来在给结构体数组赋值时,我是这样写的:
e[i]=new edge(i,x,y,l);
然后就又错了
然而我改成这样就正确了:
e[i]=edge(i,x,y,l);
应该是new只能给指针类型的初始化吧,我这个已经有了构造函数直接赋值就好,总之C++真是博大精深
╮(╯▽╰)╭。。。我真是太弱了