将传递的对象赋值给构造函数中的成员对象

assign passed object to member object in constructor

本文关键字:构造函数 成员对象 对象 赋值      更新时间:2023-10-16

由于某些原因,我无法做到这一点。

Line::Line(const Pixel &aStart, const Pixel &aEnd){
  start = aStart;
  end = aEnd;
}

Line类

class Line : public Vertex{
public:
  Line(const Pixel &start, const Pixel &end);
  Pixel getStart();
  Pixel getEnd();
private:
  Pixel start;
  Pixel end;
};

g++告诉我

错误:调用Pixel::Pixel()没有匹配的函数注:候选人为:

- Pixel::Pixel(int, int, int, int, int)
- Pixel::Pixel(int, int)
- Pixel::Pixel(const Pixel&)//not implemented by me, some sort of default constructor?

我认为实际上我使用最后一个构造函数,但有些不工作。如有任何帮助,不胜感激。

编辑:像素类:

class Pixel{
public:
  Pixel(int x, int y);
  Pixel(int red, int green, int blue, int x, int y);
  void setRed(int red);
  void setGreen(int green);
  void setBlue(int blue);
  void setColor(int r, int g, int b);
  int getRed();
  int getGreen();
  int getBlue();
  bool isChanged();
  int getX();
  int getY();
private:
  int red;
  int green;
  int blue;
  int x;
  int y;
  bool hasBeenChanged;
};

Pixelstartend类型的Line成员将在Line的构造函数运行之前默认构造,并将它们设置为作为参数传入的对象。似乎你的Pixel类没有默认构造函数(因为给任何用户定义的构造函数将阻止编译器给你一个隐式的默认构造函数)。您需要使用构造函数成员初始化列表:

Line::Line(const Pixel &aStart, const Pixel &aEnd)
  : start(aStart), end(aEnd)
{ }

这将分别用aStartaEnd初始化startend,绕过通常会发生的默认构造。

因为你声明了这个

Pixel::Pixel(int, int, int, int, int) 
Pixel::Pixel(int, int)

编译器没有生成默认构造函数,或者构造函数存在,实参具有默认值。

Pixel start;
Pixel end;

需要一个默认构造函数。它找不到,因此编译器会报错。您当前的代码需要默认构造函数。

作为一个良好的实践,使用初始化列表,它不会要求参数默认构造。

Line::Line(const Pixel &aStart, const Pixel &aEnd):start(aStart), end(aEnd){}