所以我在一个简单的坐标系统长时间休息之后今天写了一些C ++,我想我想要一个构造函数来接受2个值,这样我就可以写出像“坐标c =新坐标(1,2)”这样的东西;“
struct Coordinates {
int x;
int y;
Coordinates(int a, int b) {
x = a;
y = b;
}
};
在Cygwin中编译时,我得到:
$ g ++ -o adventure adventure.cpp adventure.cpp:36:错误:调用`Coordinates :: Coordinates()'没有匹配函数 adventure.cpp:22:注意:候选者是:坐标::坐标(常量坐标&) adventure.cpp:26:注意:Coordinates :: Coordinates(int,int)
不确定这里出了什么问题,我找不到关于C ++ struct构造函数的更多信息。有什么想法吗?
答案 0 :(得分:8)
在代码的第36行(您没有显示),您正在创建此类的对象,但您没有将任何参数传递给构造函数。唯一有效的构造函数是带有两个int的构造函数,或者是默认的复制构造函数。添加没有参数的构造函数,或更改代码以将a
和b
传递给构造函数。
答案 1 :(得分:4)
通过编写显式构造函数,您禁用了自动创建默认构造函数,该构造函数在定义没有构造函数参数的对象时使用,如Coordinates coords;
中所示。你必须明确地提供它:
struct Coordinates {
int x;
int y;
Coordinates(int a, int b) {
x = a;
y = b;
}
Coordinates(): x(0), y(0) {}
};
请注意,我在默认构造函数中初始化了成员变量;它不是强制性的,但它是一个好主意,因为否则即使在使用编译器生成的结构进行默认初始化的情况下它们也将是未定义的。
另请注意,我使用了成员初始值设定项(: x(0), y(0)
部分)而不是构造函数体中的赋值。这对于类对象来说通常会提供更好的性能,并且在某些情况下是初始化成员的唯一方法(例如,如果它是const
类型或没有默认构造函数)。
请注意,在C ++ 11中,只需编写
,就可以告诉编译器生成与没有其他构造函数时生成的默认构造函数相同的默认构造函数。Coordinates() = default;
在类定义中。