将传递的对象分配给构造函数中的成员对象

时间:2012-12-26 13:57:18

标签: c++

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

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

Line class:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

因为你声明了这个

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

Pixel::Pixel(int, int)

编译器不会生成默认的constrcutor,或者存在具有默认值的参数的构造函数。

Pixel start;
Pixel end;

这些需要默认构造函数。它找不到一个,因此编译器抱怨。您当前的代码需要默认的构造函数。

作为一种好的做法,使用初始化列表,它不会要求参数默认构建。

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