【发布时间】:2015-12-22 10:40:55
【问题描述】:
我在使用静态函数时遇到了这种奇怪的行为,但找不到解决方案。这是来自我正在为学校项目编写的计算机播放器。对于上下文: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!板子的其他字段也有奇怪的值,之前设置为true的bool是false,整数似乎有随机值,彼此不同!
为什么CreateInstance的参数和我给的完全不一样?
【问题讨论】:
-
缺少
MatchUnit::CreateInstance定义的返回类型... -
@Genuigr 好的,让我看看你调用函数 MatchUnit::CreateInstance(*realboard, *altboard, 0, currentPlayer); 后我的问题是否正确在代码中到达 [P2] 时,P1 和 P2 的参数值不同,这应该与您传递的参数相同。
-
@Xtreme_Enigma 是的,你做对了。我更正了返回类型。它什么也不返回,它只是创建一个实例并设置静态 _instance 字段
-
@Genuigr 你能分享点 [p1] 和 [p2] 的结果吗?如果可能的话,函数执行后 _eval 字段的值?如果可以的话,一个可能的 [p3]?
-
你应该写一个minimal reproducible example。
标签: c++ parameters static constants instance