没有默认构造函数的成员对象的 C++ 初始化:

C++ Initialization of member objects which do not have default constructor:

类似的问题已经得到解答,但我仍然找不到解决问题的方法。我确实无法调用 class Point inside class Rectangle 的构造函数。看了一些答案后,我大概会这样,但是不行:

class Point {
public:
  Point(int x, int y);

private:
  int x;
  int y;
};

Point::Point(int xx, int yy) {
  x = xx;
  y = yy;
}

class Rectangle {
public:    
    Rectangle(Point a, Point b) : Point(int x, int y); // this is wrong
 
private:
    Point a;
    Point b;
};

Rectangle::Rectangle(Point aa, Point bb) :  Point(int x, int y) { // same as above
    ?
}

任何人都可以帮助我了解如何实现和修复此代码(我知道将 Rectangle 声明为结构会使它更容易)?

不清楚您希望此行做什么:

Rectangle(Point a, Point b) : Point(int x, int y);

初始化成员的地方不是构造函数体。成员初始化器列表的正确语法是:

Rectangle(Point a, Point b) : a(a), b(b) {}

请注意,初始化列表是阴影不是问题的地方,您可以为参数和成员使用相同的名称,因为没有歧义。 a(a) 使用参数 a.

初始化成员 a

请注意,Point 的构造函数也应为:

Point::Point(int xx, int yy) : x(xx),y(yy) {
}

对于 int 成员,它不会产生巨大差异,但对于 class 类型,它确实产生巨大差异:成员在构造函数主体运行之前初始化。在构造函数中先初始化然后赋值是低效的,有时甚至是错误的。另一方面,当成员为 ints.

时,没有理由不使用初始化列表

PS

(I know that declaring Rectangle as a struct makes it way easier)?

我认为您指的是结构中 public 的成员。然而,structclass 只是声明一个 class 的两个不同的关键字。唯一的区别是默认访问权限(有关详细信息,请参见此处:When should you use a class vs a struct in C++?)并且这两个定义是相同的:

class foo { 
    int a;
public:
    int b;
};
struct foo {
private:
    int a;
public:
    int b;
};