2016-08-08 5 views
4

저는 C++을 처음 사용하기 때문에 OCaml과 Python에서 더 많은 경험을 쌓았습니다. 저는 "Morpion Solitaire"프로그램을 만들어 C++을 배우고 싶습니다. 나의 시작은 약간 어렵다. 다음 코드에서C++ : 클래스 멤버를 정의에 연결

:

[email protected]:~/Travail/Cplusplus/morpion++$ g++ -c morpion.cc 
morpion.cc: In constructor ‘Line::Line(char, char, direction, char, char)’: 
morpion.cc:29:57: error: no matching function for call to ‘Coords::Coords()’ 
    Line(char x1, char y1, direction d, char x2, char y2) { 
                 ^
morpion.cc:29:57: note: candidates are: 
morpion.cc:11:3: note: Coords::Coords(char, char) 
    Coords(char xx,char yy){ 
^
morpion.cc:11:3: note: candidate expects 2 arguments, 0 provided 
morpion.cc:6:7: note: Coords::Coords(const Coords&) 

라는 메시지를 이해하지 않습니다

typedef enum {NORTH, NORTHEAST, EAST, SOUTHEAST} direction; 

char deltax[4] = { 0, 1, 1, 1}; 
char deltay[4] = { 1, 1, 0, -1}; 

class Coords { 
private: 
    char x,y; 

public: 
    Coords(char xx,char yy){ 
    x = xx; 
    y = yy; 
    }; 

    char get_x() const { return x;} 

    char get_y() const { return y;} 
}; 

class Line { 
private: 
    Coords orig; 
    direction dir; 
    Coords newcross; 

public: 
    Line(char x1, char y1, direction d, char x2, char y2) { 
    orig = Coords(x1,y1); 
    dir = d; 
    newcross = Coords(x2,y2); 
    }; 

    Coords nthpoint(char n) { 
    char x,y; 

    x = orig.get_x() + n*deltax[dir]; 
    y = orig.get_y() + n*deltay[dir]; 

    return Coords(x,y); 
    }; 
}; 

컴파일러는이 나에게 알려줍니다. Coords 클래스에 대해 2 개의 인수 생성자를 제공했지만 컴파일러는 orig = Coords(x1,y1)이 0 인수로 생성자를 호출한다는 것을 계속해서 알려줍니다.

무엇을 놓쳤습니까?

비고 : 나는 처음 ... 다른 파일에 좌표 및 라인의 선언을 넣어, 나는 문제가 해결되지 않은 적절한 #include를 사용하지만, 하나 개의 파일에 최선을 다하는하지 않았다 생각

+1

컴파일러는'orig = Coords (x1, y1)'(할당 및 초기화가 아니라)를 가리 키지 않고 매개 변수 목록과 함수 본문 사이의 공백을 가리 킵니다. [Here] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)는 추천 도서 목록입니다. – molbdnilo

+0

생성자의 본문에서 할당에 대한 초기화 목록을 선호합니다. 또한 C++ 11 멤버 초기화 및 균일 초기화를 선호합니다. –

답변

1

TL ; DR : 수정은 :

Line(char x1, char y1, direction d, char x2, char y2) : 
    orig(x1, y1), newcross(x2, y2), dir(d) 
{ 
}; 

Line 클래스의 생성자는이 클래스의 모든 멤버의 생성자를 호출하고, 생성자 본체의 실행이 전을한다. 즉, 멤버 orig은 라인 이전에 구성되어야합니다.

orig = Coords(x1,y1); 

실행. 기본적으로 기본 생성자가 호출되지만, 경우에 따라 Coords 클래스에는 기본 생성자가 없습니다. 우리가 orig(x1, y1)이라고 쓸 때, 우리는 기본값을 오버라이드하고, orig을 생성하기 위해 생성자 Coords(x1, y1)이 호출된다.

+0

도움 주셔서 감사합니다. 너무 빨리 !!!:-) Stroustrup의 C++ 책에서이 구문을 보았지만 지금은 이해하지 못했습니다. 나는 releived되었습니다 :-P –

+0

Downvoter, 편집 후 반대 하시겠습니까? 이제 괜찮습니다. –

+1

BTW 초기화 목록이 선언 순서대로 있어야하며 그렇지 않으면 컴파일러는 신음합니다. 즉, orig (...), newcross (...), dir (...)이 아닌 orig (...), dir (...), newcross (...)입니다. – anatolyg

5

문제는 생성자 본문을 입력하기 전에 모든 클래스 멤버와베이스를 구성해야한다는 것입니다. 그 때문에 어떤 생성자가 실제로 컴파일러에 의해 추가 된 암시 적 구조를 가진 후처럼 보이는 것은이 그것을 암시 적으로 구성 할 수 있지만, Coords 그렇게 orig()하지 않고 newcross() 실패 이후 dir에 대한 문제가되지 않는다

Line(char x1, char y1, direction d, char x2, char y2): orig(), dir(), newcross() { 
    orig = Coords(x1,y1); // this is assignment not construction 
    dir = d; // this is assignment not construction 
    newcross = Coords(x2,y2); // this is assignment not construction 
}; 

입니다.

는 멤버 초기화 목록을 사용할 필요가이 문제를 해결하고 기본 생성자가없는

Line(char x1, char y1, direction d, char x2, char y2) : orig(x1, y1), newcross(x2, y2), dir(d) {} 
6
Line(char x1, char y1, direction d, char x2, char y2) 
    : orig(x1,y1), dir(d), newcross(x2, y2) {} 

Coords 같은 생성자가합니다. 원래 코드는 먼저 기본값을 생성하고 orig을 생성 한 다음 새 값을 할당하려고 시도합니다. 그러나 기본 생성자가 없으므로 첫 번째 단계는 실패합니다.

관련 문제