1

何らかの理由でこれを達成できません。

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

2 に答える 2

4

タイプ、およびのLineメンバーは、コンストラクターが実行される前にデフォルトで構築され、引数として渡されたオブジェクトに設定されます。あなたのクラスにはデフォルトのコンストラクターがないようです (ユーザー定義のコンストラクターを与えると、コンパイラーが暗黙的なデフォルトのコンストラクターを与えるのを止めるため)。コンストラクター メンバーの初期化リストを使用する必要があります。PixelstartendLinePixel

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

これは、通常発生するデフォルトの構築をバイパスして、および をstartそれぞれend使用して初期化します。aStartaEnd

于 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 に答える