C ++将参数类型解释为Constructor

时间:2013-11-15 10:30:30

标签: c++ types parameters constructor compiler-errors

社区,

我完全不熟悉c ++,所以我希望你能帮助我。 我已经用Java编写了很多相似之处,但我无法理解这个错误。 看来,在我的PrimitiveBase.cpp的构造函数中,编译器将Type Color解释为没有参数的构造函数,我没有。 当我定义第二个没有参数且没有功能的构造函数时,错误就消失了。 但这与我对函数参数decleration的理解不符。

她的错误是:

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/PrimitiveBase.cpp: In constructor 'PrimitiveBase::PrimitiveBase(std::vector<Coordinate>, Colour)':

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/PrimitiveBase.cpp:5:74: error: no matching function for call to 'Colour::Colour()'

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/PrimitiveBase.cpp:5:74: note: candidates are:

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/Colour.hh:9:2: note: Colour::Colour(int, int, int, std::string)

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/Colour.hh:9:2: note:   candidate expects 4 arguments, 0 provided

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/Colour.hh:6:7: note: Colour::Colour(const Colour&)

/home/christian/Documents/EBV/ebv-S03-G01/src/Graphics2D/Colour.hh:6:7: note:   candidate expects 1 argument, 0 provided

这里是您可能需要的代码: 的 PrimitiveBase.cpp

#include <Graphics2D/PrimitiveBase.hh>
#include <Graphics2D/Coordinate.hh>
#include <Graphics2D/Colour.hh>

PrimitiveBase::PrimitiveBase(std::vector<Coordinate> coord, Colour colour) {    //Here the error happens
this->coord=coord;
this->colour=colour;
}

Colour PrimitiveBase::GetColour() {

return colour;

}

std::vector<Coordinate> PrimitiveBase::GetCoordinates() {

return coord;

}

void PrimitiveBase::SetColour(int red, int green, int blue) {

colour.SetColours(red,green,blue);

}

void PrimitiveBase::SetCoordinates(std::vector<Coordinate> newCoord) {

coord = newCoord;

}

Colour.hh

#ifndef COLOUR_HH_
#define COLOUR_HH_

#include <string>

 class Colour {

public:
Colour(int red, int green, int blue, std::string name);
//Colour(){};   Constructo I seem to need
//~Colour();
void SetColours(int red, int green, int blue);
static Colour black();
static Colour red();
static Colour green();
static Colour blue();

private:
std::string name;
unsigned char rgb[3];

};

#endif

我真的不明白,因为我在Java的最后两年做了这个,在最后的练习中它也在c ++中工作。

如果你能帮助我,我会很高兴的。)

3 个答案:

答案 0 :(得分:3)

您有一个Colour数据成员,并且您没有在构造函数中初始化它。因此,尝试调用其默认构造函数。没有默认构造函数,因此您收到编译错误。要初始化它,请使用构造函数初始化列表:

PrimitiveBase::PrimitiveBase(std::vector<Coordinate> coord, Colour colour) 
  : coord(coord), colour(colour) // HERE
{

}

一旦进入构造函数体内,所有实例都已被隐式或显式初始化。你只能修改它们。

答案 1 :(得分:2)

您需要使用初始化列表。否则,在进入构造函数体之前,颜色将默认构造。

PrimitiveBase::PrimitiveBase(std::vector<Coordinate> coord, Colour colour) :
coord(coord),
colour(colour)
{
}

答案 2 :(得分:0)

我会说你是lac Colour默认构造函数,因为你已经提供了一个参数化构造函数,所以你需要定义一个没有参数的默认构造函数或正确初始化PrimitiveBase的对象:

类似的东西:

Colour() 
    : name("") 
    , rgb()
{}

或:

PrimitiveBase::PrimitiveBase(std::vector<Coordinate> coord, Colour colour) 
: coord(coord)
, colour(colour)
{}

另一方面,最好在构造函数的初始化列表中初始化类的对象,而不是在构造函数体中进行赋值:Member Initialization List over Assignment