2011-06-14 3 views
2

그래서 조각 클래스를 보드 상에 표현해야하는데, 거기에서 상속받은 두 개의 다른 클래스를 가질 계획이다. 그러나 이렇게하는 데 많은 어려움을 겪었습니다. 지금까지 관련 코드가 있습니다.나는 상속을 엉망으로 만들고있다.

/// 
/// PIECE CLASS HERE 
/// this is an abstract class from which Barrier and Pawn inherit. 

class Piece 
{ 
public: 
    Piece(Space* start); 
    sf::Shape m_Circle; 
protected: 
    int m_X; 
    int m_Y; 
    int m_radius; 
    Space* CurrentSpace; 
}; 

Piece::Piece(Space* start): 
    m_X(start->GetX()), 
    m_Y(start->GetY()), 
    m_radius(14), 
    CurrentSpace(start) 
{} 

/// 
/// BARRIER CLASS HERE 
/// these are the white stones that block a player's path 

class Barrier : public Piece 
{ 
public: 
    Barrier(Space* initial); 
    void Move(Space* target, bool isCapturing); 
}; 

Barrier::Barrier(Space* initial) 
{ 
    Piece(initial); 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

void Barrier::Move(Space* target, bool isCapturing) 
{ 
    int xChange = abs(target->GetX() - m_X); 
    int yChange = abs(target->GetY() - m_Y); 
    m_Circle.Move((float)xChange, (float)yChange); 
    CurrentSpace.ToggleOccupied(); 
    if(!isCapturing) 
    { 
     (*target).ToggleOccupied(); 
    } 
    CurrentSpace = target; 
} 

나는 특히 내가 이해하지 못하는 오류의 하중을 받고 있어요 : C++에 새가되는

no matching function for call to Piece::Piece() 
declaration of 'Piece initial' shadows a parameter 
no matching function for call to 'Barrier::Move(Piece&)' 
request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'| 

, 나는이 모든 잘못 무슨 일이 일어나고 있는지 이해가 안 돼요. C++을 배웠던 책에서 찾은 코드와 비슷한 코드를 만들려고했지만 분명히 약간의 미묘한 점을 간과했습니다. 내가 호출하려고하는 모든 함수는 적절한 위치에있는 것처럼 보이며 프로토 타입과 동일한 값으로 정의합니다.

답변

12

첫 번째 오류이 발생합니다 :

Barrier::Barrier(Space* initial) 
{ 
    Piece(initial); 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

요구를 같이하기 :

Barrier::Barrier(Space* initial) : Piece(initial) 
{ 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

기본 클래스 '생성자는 생성자 전에 실행 (상관없이)를 - 당신은 할 필요가 없습니다 초기화 목록에 인수가 필요한 경우 인수를 전달합니다.

어떤 오류가 발생했는지 모르기 때문에 다른 오류가 있는지 잘 모르겠습니다. 당신은 슈퍼 클래스를 초기화 할 경우

+2

두 번째 오류는 클래스 중괄호 안의'Piece (initial)'가 지역 변수를 선언 한 다음'Move (initial)'가'Piece' lvalue를'Barrier :: 이동 '기능. –

1

,이처럼 수행해야합니다

Barrier(Space* initial): 
    Piece(initial) { 
    ... 
} 

명시 적으로 기본 유형을 초기화하지 않으면, 컴파일러와 생성자를 호출하여 초기화하려고합니다 이 같은 빈 인수 목록 :

Barrier(Space* initial): 
    Piece() { 
    ... 
} 

하지만 제로 인수를 조각에 대한 생성자를 정의하지 않기 때문에, 당신은 당신이 설명하는 컴파일러 오류가 발생합니다.

4

라인

Piece(initial); 

의 괄호는 컴파일러에 의해 무시됩니다. 당신은 매개 변수와 같은 이름을 가진 변수 선언됩니다 또한

Barrier::Barrier(Space* initial) : Piece(initial) 

Move 기능 :

Piece initial; 

initial으로 Piece 기본 오브젝트를 초기화하기를, 당신은 멤버 초기화리스트를 사용해야합니다 두 가지 주장을 기대하지만, 당신은 하나만 지나치고 있습니다. 부울을 잊어 버렸습니다.

+0

아니요, 저는 그가 함수를 호출하고 '초기'매개 변수를 전달하고 있다고 생각합니다. –

+0

@Billy :'Piece'는 함수가 아니지만'Move'는 함수입니다. – fredoverflow

+0

그래, 그 줄은 스택에 임시 Piece 객체를 만들고, 그것을 initial로 초기화 한 다음 즉시 폐기합니다. 선언은 없습니다 ... – Adrian

1

좋은 답변입니다.게다가 그 최종 어려운 라인

request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'|

당신이 CurrentSpace 포인터로 선언 한

CurrentSpace.ToggleOccupied();

에서 발생되고, 그래서 이것은

을해야 CurrentSpace-> ToggleOccupied() ;

+0

와우, 너희들은 최고야. 다행히도 코딩 기술은 결국 다른 사람들을 도울 수있는 수준까지 올라갈 것입니다! 나는 그것을 고쳤고, 그것은 모두 다시 작용한다. 대단히 감사합니다! – GarrickW

관련 문제