2013-03-28 2 views
0

다른 클래스의 내 주 클래스에서 사용 된 배열에 액세스하는 데 문제가 있습니다. 내 응용 프로그램은 2D 플랫폼 게임을 만들기위한 편집기입니다. 기본적으로 2D 자산 (세그먼트)을 배치하고 레벨을 구성 할 수 있습니다.C++로 다른 클래스의 한 클래스에서 배열에 액세스

내 메인 클래스는지도 세그먼트 클래스의 배열을 처리합니다. 배열의 각 세그먼트 클래스는지도에서 세그먼트의 위치, 크기 및 회전과 같은 정보를 보유하고이를 화면에 그립니다.

필자는 메인 클래스에서 초기화되고 파일에서 사용 가능한 세그먼트 그리드를 그리는 데 사용되는 기본적으로 패널 (드래그 앤, 크기 조정 가능) 인 별도의 클래스를 사용합니다. 필요한 것은 메인 클래스에서 참조되는 배열에 정보를 추가하는 세그먼트 중 하나를 클릭하는 것입니다.

나는 배열 선언 내 메인 클래스 "맵"이 (간체)

map.h

class Map 
{ 
public: 
    MapSegment* mapSeg[512]; 
}; 

그때 나는를 만들 때 해당 배열의 참조를 보내려고을 패널과 같이, 가능한 세그먼트를 표시하려면

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg); 

세그먼트 패널 헤더가 형성되어 다음과 같이

class SegmentPanel : public Panel 
{ 
public: 
    SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512];); 
    void Update(); 
    void Draw(sf::RenderWindow & renderWindow); 
    void ReadSegments(); 
private: 
    std::vector<SegmentDefinition *> segDef; 
    MapSegment* mapSeg[512]; 
}; 

그리고 SegmentPanel CPP :

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512]) 
    : Panel(_position) 
{ 
    panelTitle = "Segment Selection"; 
} 

void SegmentPanel::Update() 
{ 
    // Update segments 
} 

void SegmentPanel::Draw(sf::RenderWindow & renderWindow) 
{ 
    // Draw default panel items 
    Panel::Draw(renderWindow); 

// Draw segments 
} 

그러나, SegmentPanel.cpp 클래스의 배열에 요소를 추가 내 주요 Main 클래스에 반영하지 않는 것 - 메모리에 새로운 배열을 만들 것 .

나는 C++로 작업 한 후에도 여전히 C++을 처음 접했습니다!

+4

첫 번째 관찰 및 가능성이 높은 근본 원인 : 수업이 ** [Rule of Three] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) *를 따르지 않음 * *. –

+2

C# 백그라운드에서와 같이 대신'std :: vector'를 사용해야합니다. 놀라운 포인터를 다루는 일은 지루할 것입니다. – ashgkwd

+0

팁 주셔서 감사합니다 - 이제 std :: vector를 사용하도록 약간 변경했습니다 –

답변

4

먼저 C++에는 배열 매개 변수 유형 같은 것이 없습니다. SegmentPanel 생성자에서 MapSegment* mapSeg[512] 매개 변수는 실제로 MapSegment** mapSeg과 같습니다. 포인터에 대한 포인터 일뿐입니다!

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg); 

여기에서 배열 mapSeg을 전달하려고 시도했습니다. 이것은 첫 번째 요소 (MapSegment**)에 대한 포인터로 바꾸고 포인터를 전달하는 배열 간 변환을 거친다.

이것은 모두 괜찮습니다. 생성자에서 mapSeg 인수를 사용하면 아무 작업도 수행하지 않습니다. 배열에 액세스하려면 해당 포인터를 어딘가에 저장해야합니다. 멤버 초기화 목록에

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment** mapSeg) 
    : Panel(_position), mapSeg(mapSeg) 
{ 
    panelTitle = "Segment Selection"; 
} 

mapSeg의 초기화를 그런 다음에 생성자를 변경

MapSegment** mapSeg; 

: 당신은 멤버를 변경하여 SegmentPanelmapSeg라는 것을 할 수 있습니다.이 작업을 수행 할 수


또 다른 방법은 대신 배열 형식 인수에 참조를 가지고하는 것입니다. mapSeg 인수의 유형은 "512 포인터의 배열에 대한 참조 MapSegment에"입니다

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* (&mapSeg)[512]) 
    : Panel(_position), mapSeg(mapSeg) 
{ 
    panelTitle = "Segment Selection"; 
} 

:처럼 생성자는 지금 보일 것이다. 그런 다음 회원 mapSeg을 동일한 유형으로 만들어야합니다.

+0

고마워요! 당신의 설명이 많은 도움이되었습니다! –

관련 문제