3

因此,在为一个简单的坐标系休息了很长时间之后,我今天写了一些 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: 注意:候选人是:Coordinates::Coordinates(const Coordinates&) Adventure .cpp:26: 注意: Coordinates::Coordinates(int, int)

不知道这里出了什么问题,我找不到关于 C++ 结构构造函数的太多信息。有任何想法吗?

4

2 回答 2

8

在代码的第 36 行(您没有显示)中,您正在创建此类的一个对象,但您没有将任何参数传递给构造函数。唯一有效的构造函数是带有两个整数的构造函数,或者是默认的复制构造函数。a添加一个不带参数的构造函数,或者更改要传递b给构造函数的代码。

于 2012-05-21T23:59:53.313 回答
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;

在类定义中。

于 2012-05-22T00:02:44.547 回答