2014-01-08 2 views
0

빠른 질문을하고 싶습니다.객체 유형 포인터의 2D 배열에 대한 포인터

내가 클래스가 "ChessPiece"

#ifndef CHESSPIECE_H 
#define CHESSPIECE_H 

#include "Globals.h" 

// Abstract class for inheritence 
class ChessPiece { 
public: 
    // Constructor 
    ChessPiece(bool isWhite) : m_isWhite(isWhite) { 
    } 
    // No dynamic allocation 
    ~ChessPiece(void) {} 

    // pure virtual functions 
    virtual CellLocation *listAvailableMoves(void) = 0; 
    virtual char getPieceType(void) = 0; 
    virtual ChessPiece *clonePiece(void) = 0; 

    // ACCESSORS, MUTATORS 
    // isWhite member 
    bool isWhite(void) const{ 
     return m_isWhite; 
    } 

    void setIsWhite(bool isWhite) { 
     m_isWhite = isWhite; 
    } 

protected: 
    bool m_isWhite; 
}; 
#endif 

라고하고 나는이 같은 변수가 : 나는이 변수에 대한 포인터를 정의 할 수있는 방법을 알고 싶어

ChessPiece *m_gameBoard[8][8];

를? ChessPiece *(*pGameBoard)[8][8]과 같을 것이라고 생각했지만 원하는 것은 아닙니다. 예를 들어 내가 이렇게 전화하고 싶다고 말하면 *pGameBoard[2][2]->isWhite() (작동하지 않습니다) 어떻게해야합니까?

미리 답변 해 주셔서 감사합니다.

+0

참조 http://stackoverflow.com/questions/8617466/a-pointer-to-2d-array – IdeaHat

+0

물론 'm_gameBoard'는 'ChessPiece'의 배열이 아니라 포인터 배열입니다. 그래? –

+0

예. 알고 있습니다. Chesspiece 포인터의 2 차원 배열입니다. –

답변

0

ChessPiece *(*pGameBoard)[8][8];m_gameBoardChessPiece *m_gameBoard[8][8];에 있음 유형에 대한 포인터를 선언한다. 당신은 예를 들어, 그것을 사용한다 : 그러나

(*pGameBoard)[2][2]->isWhite() 

, 대부분의 상황에서, 그것과 마찬가지로, 대신 전체 배열의 가장 바깥 쪽 배열의 요소를 가리 키도록 만족 :

ChessPiece *(*pGameBoard)[8]; 

전체 배열에 대한 포인터와 배열의 첫 번째 요소에 대한 포인터는 실제로 동일한 주소입니다. 후자는 이미 적용 * 연산자 이전에 해당하기 때문에, 당신은 다음과 같이 사용할 수 있습니다 : 첫 번째 선언으로, 당신은 할당하거나 포인터를 사용하여 초기화 할 것이다

pGameBoard[2][2]->isWhite() 

주 와 같이 전체 배열 :

ChessPiece *(*pGameBoard)[8][8] = &m_gameBoard; 

반면, 후자의 선언, 할당하거나와 같이 배열의 첫 번째 요소에 대한 포인터를 사용하여 초기화 할 것이다;

ChessPiece *(*pGameBoard)[8][8] = &m_gameBoard[0]; 

은 또는, 꾸밈 배열이 자동으로, 자사의 첫 번째 요소에 대한 포인터로 변환됩니다 동등하기 때문에 :

ChessPiece *(*pGameBoard)[8][8] = m_gameBoard; 
+0

네 대답이 많이 설명되었다. 감사. 역 참조 연산자를 사용하지 않기 때문에 후자를 사용해야합니다. 역 참조 연산자 (* asdf)가 성능 비용을 암시합니까? –

+0

@JohnJohn : 정상적인 C++ 구현에서 런타임 값이 변경되지 않으면 컴파일 타임에 완전히 취소 할 수 있으므로 성능 비용이 들지 않을 것으로 예상됩니다. (C++ 표준은 성능 비용이 없다는 것을 ** 요구하지 않지만, 표준을위한 모든 구현은 "포인터를 배열로"에서 "요소를 가리키는 포인터"로 변경합니다. 성능 비용이없는 현대적인 아키텍처는 품질이 매우 낮습니다. 대부분의 사람들은 "자연스러운"외관 때문에 후자를 사용합니다. –

+0

답장을 보내 주셔서 다시 한번 감사드립니다. –

0
ChessPiece *m_gameBoard[8][8]; 

ChessPiece * (*pGameBoard)[8]; 
+0

그래서 .... pGameBoard는 m_gameBoard 배열의 처음 8 개 요소에 대한 포인터입니다. –

+0

네, 맞습니다. 그것은 8 개의 원소를 가진 포인터 배열에 대한 포인터입니다. 즉 원래 배열의 첫 번째 행을 가리 킵니다. –

0

나는 당신이 그 ChessPiece 개체에 대한 공간을 할당하고 방법을 잘 모르겠어요. 스택에 할당할지 아니면 동적으로 할당할지에 관계없이 기본 생성자가 없으므로 컴파일 오류가 g++에서 발생합니다. 스택에 인스턴스 배열을 할당하거나 new을 사용하면 생성 된 각 인스턴스에 대해 기본 생성자가 호출됩니다.

ChessPiece() : m_isWhite(false) {} 

는 그런 다음 같은 스택에 배열을 할당 할 수 있습니다 : 당신의 ChessPiece 클래스에서

기본 생성자 추가

ChessPiece pieces[8][8]; 

을 그리고 사용하여 해당 배열에 액세스 :

pieces[i][j].isWhite(); 

이것은 나에게 더 직설적 인 것처럼 보입니다. 당신의 생각을 알려주십시오.

또한 Cell 개체의 표를 나타내는 Board 개체를 사용하여 구성하는 것이 좋습니다. 각 Cell은 조각이 있는지 여부를 추적하고 조각이있는 경우 해당 조각의 참조/사본을 반환 할 수 있습니다. 나에게 그것은 개념적으로 명확하다. 그러나 당신의 방법에도 아무런 문제가 없다. :)

+0

요점은 동적 배열을 사용하여 힙 크기에 대한 비용을 의미하지 않는다는 것입니다. 나는 "ChessPiece"가 단지 2 바이트가되도록 코드를 수정했지만, 포인터는 4 바이트가됩니다. 귀하의 접근 방식에있어 우리는 모두 이사회 표현에 대한 동일한 생각을 사용하고 있으며, 이름은 중요하지 않습니다. 유일한 다른 옵션은 보드를 저장하는 것이 아니라 자신의 위치를 ​​저장하는 조각을 배열하는 것이 었습니다. 그러나 위치를 검색 할 때 약간의 성능 비용이 들었으므로이를 선택했습니다. 관심을 가져 주셔서 감사합니다. –

+0

나는 당신이 의미하는 것을 이해하지 못한다. 동적 할당은 정의에 의해 힙 공간을 차지한다. 이 시점에서 프로그램을 제대로 작동시키는 데 중점을 두어야합니다. 조숙 한 최적화는 모든 악의 근원입니다! 난 정말 그 두 또는 4 바이트, 또는 힙에 대한 비용에 대해 걱정하지 않을 것이다. 수십 년 전의 컴퓨터로 작업하지 않는다면, 체스 보드에 충분한 메모리가 충분해야합니다. – Keeler

+0

피스 검색 결과에 어느 정도의 성능 히트가 있었습니까? 선형 검색을 수행 할 수 있습니다. 선형 검색은 64 개 항목의 배열에 시간이 필요하지 않습니다. – Keeler

관련 문제