2013-11-15 2 views
1

커뮤니티,C++에서 매개 변수 유형을 생성자로 해석합니다.

저는 C++의 새로운 기능을 제공하므로 저를 도울 수 있기를 바랍니다. 나는 이미 Java로 작성했으며 많은 유사점이 있지만이 오류를 이해할 수는 없습니다. PrimitiveBase.cpp의 Constructor에서 컴파일러가 Type Color를 인수가없는 생성자로 해석하는 것으로 보입니다. 인수 및 기능이없는 두 번째 생성자를 정의하면 오류가 사라집니다. 하지만 함수에 대한 매개 변수 해독에 대한 내 이해와 일치하지 않습니다. 여기

/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 

내가 r에 eally는 Java에서 지난 2 년 동안 이것을했기 때문에 이해하지 못하고 마지막 연습에서도 C++로 작업했습니다. 당신이 나를 도울 수 있다면 :)

+1

생성자의 매개 변수 목록 뒤에 * mem-initializer-list *를 사용해야합니다 클래스의 모든 데이터 멤버를 구성 *.'PrimitiveBase :: PrimitiveBase (std :: vector coord, color color) : coord (coord), color (color) {}'(이것은 매개 변수의 이름과 데이터 멤버는 동일하지만 고유 한 이름을 제공하는 것이 더 좋음) – dyp

+0

PrimitiveBase에 대한 hh를 표시 할 수 있습니까? –

+0

DyP 와우, 고마워. 정말 빠른 답변이었고 도움이되었습니다. –

답변

2

초기화 프로그램 목록을 사용해야합니다. 그렇지 않으면 생성자의 본문에 들어가기 전에 색상이 기본값으로 생성됩니다.

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

안녕하세요 PeterWood. 대단히 고맙습니다. Semms는 C++ 의미론에 대한 기본적인 이해가 필요합니다. –

3

당신은 Colour 데이터 멤버가 매우 기쁠, 당신은 생성자에서를 초기화하지 있습니다. 따라서 기본 생성자를 호출하려고 시도합니다. 기본 생성자가 없으므로 컴파일 오류가 발생합니다.

생성자의 본문에 일단
PrimitiveBase::PrimitiveBase(std::vector<Coordinate> coord, Colour colour) 
    : coord(coord), colour(colour) // HERE 
{ 

} 

, 모든 인스턴스가 초기화되고, 암시 적 또는 명시 적으로 : 초기화하려면 생성자 초기화 목록을 사용합니다. 그것들을 수정할 수 있습니다.

+0

감사합니다. 즉시 도움이 된 :) –

0

난 당신이 이미 매개 변수화 생성자를 제공하고 있기 때문에 당신이 그렇게 당신이 PrimitiveBase의 객체 없음 4. 기본값으로 기본 하나를 정의하거나 제대로 초기화 할 필요가 Colour 기본 생성자를 LAC 말할 것이다 :

을 뭔가 같은 :

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

나 :

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

반면에 생성자의 초기화 목록에서 생성자의 본문에 할당하지 말고 항상 클래스의 객체를 초기화하는 것이 좋습니다. Member Initialization List over Assignment

관련 문제