[英]A pointer to 2D Array of Object Type Pointers
我只是想问一个简单的问题。
我有一堂课叫做“ 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()
拨打电话(这不起作用),我该怎么做?
预先感谢您的回答。
ChessPiece *m_gameBoard[8][8];
ChessPiece * (*pGameBoard)[8];
ChessPiece *(*pGameBoard)[8][8];
确实声明了一个指向m_gameBoard
在ChessPiece *m_gameBoard[8][8];
的类型的指针ChessPiece *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;
我不确定您如何为这些ChessPiece
对象分配空间。 无论我尝试将其分配在堆栈上还是动态分配,由于没有默认构造函数,我都会从g++
收到编译错误。 当您在堆栈上或使用new
分配实例数组时,将为每个创建的实例调用默认构造函数。
在您的ChessPiece类中添加默认构造函数:
ChessPiece() : m_isWhite(false) {}
然后,您可以按以下方式在堆栈上分配数组:
ChessPiece pieces[8][8];
并使用以下命令访问该数组:
pieces[i][j].isWhite();
这对我来说似乎更直接,请让我知道您的想法。
另外,您可能要考虑使用Board
对象进行组织,该对象代表Cell
对象的网Cell
。 每个Cell
跟踪它是否有一块,如果有,可以返回该块的参考/副本。 对我来说,从概念上讲这很清楚,但是您的方式也没有错。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.