1

出于某种原因,我无法做到这一点。

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

线类:

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;
};
4

2 回答 2

4

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

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

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

于 2012-12-26T14:05:08.023 回答
1

因为你声明了这个

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){}
于 2012-12-26T14:06:01.977 回答