C ++关于函数范围的一个小问题

时间:2014-08-07 04:19:48

标签: c++ scope

我正在处理这个俄罗斯方块教程,到目前为止一点一点地理解它,但我已经到了一个困扰我的地步。这是有问题的教程:

http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/

我的问题涉及范围和功能的小问题。这是具有相关功能的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?我已经尝试过它并且放弃了,所以也许这里有人可以提供帮助。

1 个答案:

答案 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数组。我希望这有帮助!