我有一个静态函数的奇怪行为,无法找到解决方案。这是我为一个学校项目写的计算机播放器。对于上下文:Board和Evaluation是我的逻辑使用的类,但它们的功能在这里并不重要。
我有一个类MatchUnit,它有一个创建实例的方法和一个指定本地字段的构造函数:
static void MatchUnit::CreateInstance(Board& realBoard, Board& altBoard, unsigned char turn, char currentPlayer)
{
// [P2]
_instance = new MatchUnit(realBoard, altBoard, turn, currentPlayer);
return _instance;
}
MatchUnit::MatchUnit(Board& realBoard, Board& altBoard, unsigned char turn, char currentPlayer)
{
_realBoard = &realBoard;
_altBoard = &altBoard;
_turn = _moveNr = turn;
_currentPlayer = currentPlayer;
}
MatchUnit.h
class MatchUnit {
public:
static MatchUnit* CreateInstance(Board& realBoard, Board& altBoard, unsigned charturn, char currentPlayer);
private:
Board* _realBoard;
Board* _altBoard;
uchar _turn;
uchar _moveNr;
char _currentPlayer;
MatchUnit(Board& realBoard, Board& altBoard, unsigned char turn, char currentPlayer);
};
MatchUnit是一个单身人士,但是我离开了getter和实例的字段,因为我认为它们不重要。
Board包含非静态私有评估指针(Evaluation* _eval
)
在我的主要功能中,我现在称之为有问题的方法:
Board* realboard = new Board();
Board* altboard = new Board();
// Internally the board constructors assigned their field pointers:
// _eval = new Evaluation();
// [P1]
MatchUnit::CreateInstance(*realboard, *altboard, 0, currentPlayer);
如果我使用VS2015的调试视图并在[P1]处暂停,我可以看到板的_eval字段没有指向null。但是,当我继续指向[P2]时,他们指向null!板的其他区域也有奇怪的值,bool设置为true,之前是false,整数似乎有随机值,彼此不同!
为什么CreateInstance
的参数与我给他们的参数完全不同?
答案 0 :(得分:1)
函数CreateInstance
的签名在标题和来源方面有所不同。在您的源代码中,您将第三个参数声明为类型uchar
,而在标题中将其声明为unsigned (int)
(可能是由于错误输入空格)。当您调用函数时,编译器会生成与标题中的参数匹配的代码,而您的函数将使用源中定义的参数。由于参数大小不匹配,您的功能似乎收到了错误的值。您只需编辑其中一个参数定义即可解决此问题。