我正在处理这个俄罗斯方块教程,到目前为止一点一点地理解它,但我已经到了一个困扰我的地步。这是有问题的教程:
我的问题涉及范围和功能的小问题。这是具有相关功能的Pieces类,在头文件中:
#ifndef _PIECES_
#define _PIECES_
class Pieces
{
public:
int GetBlockType (int pPiece, int pRotation, int pX, int pY);
int GetXInitialPosition (int pPiece, int pRotation);
int GetYInitialPosition (int pPiece, int pRotation);
};
#endif // _PIECES_
现在这里是.cpp文件中的函数GetBlockType()。
int Pieces::GetBlockType (int pPiece, int pRotation, int pX, int pY)
{
return mPieces [pPiece][pRotation][pX][pY];
}
编译器告诉我mPieces
是未声明的标识符。有一个名为mPieces
的变量,但我在main.cpp中声明了它。
问题是范围问题吗?我是否在错误的地方宣布mPieces
?我已经尝试过它并且放弃了,所以也许这里有人可以提供帮助。
答案 0 :(得分:0)
我下载了源代码,可以看到可能存在混淆的地方。在Main.cpp中,程序声明了一个mPieces
对象,但它是类Pieces的一个实例。然后使用指向该对象的指针初始化Board和Game实例。
<强> Main.cpp的:强>
// Pieces
Pieces mPieces;
// Board
Board mBoard (&mPieces, mScreenHeight);
// Game
Game mGame (&mBoard, &mPieces, &mIO, mScreenHeight);
然后我们查看Pieces的头文件和实现文件。在头文件中,我们没有看到任何类型的数据结构的引用 - 因此仍然不清楚GetBlockType
函数在哪里找到mPieces。
当我们查看Pieces.cc时,我们看到GetBlockType
引用的mPieces实际上是一个硬编码的4维char数组:
<强> Pieces.cpp:强>
#include "Pieces.h"
// Pieces definition
char mPieces [7 /*kind */ ][4 /* rotation */ ][5 /* horizontal blocks */ ][5 /* vertical blocks */ ] =
{
// all the possible positions
}
// irrelevant code omitted
int Pieces::GetBlockType (int pPiece, int pRotation, int pX, int pY)
{
return mPieces [pPiece][pRotation][pX][pY];
}
char mPieces
数组实际上是在全局范围内声明的,因此#include "Pieces.h"
之后的程序的任何部分都可以访问它。在Main.cpp中,mPieces名称在Pieces mPieces
声明的本地范围内被覆盖。
现在我们看到在Main.cpp中,mPieces是Pieces的一个实例。但是,Pieces类本身引用了一个不同的mPieces - 一个在Pieces.cpp类中定义的char数组。您应该验证您的Pieces.cpp是否具有正确的mPieces数组。我希望这有帮助!