结构体中的易错点


作为一名蒟蒻,我常常在各种各样的编程问题上磕磕绊绊。今天又是这样。

问题 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++真是博大精深

╮(╯▽╰)╭。。。我真是太弱了