指向2D数组对象类型指针的指针

时间:2014-01-08 15:46:52

标签: c++ arrays multidimensional-array

我只是想问一个简短的问题。

我有一个名为“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()(这不起作用)我该怎么做?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:0)

ChessPiece *m_gameBoard[8][8];

ChessPiece * (*pGameBoard)[8];

答案 1 :(得分:0)

ChessPiece *(*pGameBoard)[8][8];会声明指向m_gameBoard ChessPiece *m_gameBoard[8][8];所在类型的指针。您可以使用它,例如:

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

但是,在大多数情况下,指向最外层数组的元素而不是整个数组是令人满意的,如:

ChessPiece *(*pGameBoard)[8];

指向整个数组的指针和指向数组第一个元素的指针实际上是相同的地址。但是,因为后者与已应用*运算符的前者相同,所以可以像这样使用它:

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

请注意,使用第一个声明,您将使用指向整个数组的指针来分配或初始化它,如:

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

while,在后一个声明中,您将使用指向数组第一个元素的指针来分配或初始化它,如同;

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

或者,相当于因为unadorned数组自动转换为指向其第一个元素的指针,其中包含:

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

答案 2 :(得分:0)

我不确定你是如何为那些ChessPiece对象分配空间的。无论我是尝试在堆栈上还是动态分配,我都会从g++获得编译错误,因为没有默认的构造函数。在堆栈上分配实例数组或使用new时,将为每个创建的实例调用默认构造函数。

在你的ChessPiece类中添加一个默认构造函数:

ChessPiece() : m_isWhite(false) {}

然后您可以在堆栈上分配数组:

ChessPiece pieces[8][8];

使用以下方法访问该数组:

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

这对我来说似乎更直接,让我知道你的想法。

此外,您可能需要考虑使用Board对象进行组织,该对象表示Cell个对象的网格。每个Cell跟踪它是否有一个片段,如果有,可以返回该片段的参考/副本。对我而言,这在概念上更清晰,但你的方式也没有错。 :)