我在按正确顺序初始化静态const字段时遇到问题。我想首先初始化我的方向,然后是它们的向量:
文件Direction.hh:
class Direction {
public:
static const Direction LEFT;
static const Direction RIGHT;
static const Direction UP;
static const Direction DOWN;
int x_,y_;
char code_;
Direction(const int x,const int y,const char c) : x_(x), y_(y), code_(c) {}
Direction(const Direction& d) : Direction(d.x_, d.y_, d.code_) {}
private:
Direction() {x_ = y_ = 0; code_ = ' ';}
};
文件Direction.cc:
const Direction Direction::LEFT(-1,0,'L');
const Direction Direction::RIGHT(1,0,'R');
const Direction Direction::UP(0,1,'U');
const Direction Direction::DOWN(0,-1,'D');
主程序:
#include <vector>
#include <iostream>
#include "Direction.hh"
const std::vector<Direction> move_order({Direction::UP,Direction::RIGHT,Direction::DOWN,Direction::LEFT});
int main(void) {
for(const Direction & d : move_order) std::cerr << d.code_<<" ";
}
上面的代码只是一个合成的例子,表现为我的真实(更长)代码。所以我很感激这个问题的一般解决方案,而不是建议如何修复这个特定的程序。我的目标是将大型Java库重写为C ++。这样的图案在那里使用了好几次。在Java中它可以正常工作,因为在加载类时,静态初始化程序块可以正确初始化LEFT或UP。
我希望这段代码可以打印出来,但它会打印出#34; &#34;相反,这表明我没有初始化字段。这对我来说非常令人费解,因为我故意将默认构造函数设为私有以避免这种空初始化。
ANSWER
在Michael Burr的评论中,我搜索了static initialization order fiasco并了解到我应该用方法替换变量。在我的实现中,这看起来像:
const std::vector<Direction> & move_order() {
static const std::vector<Direction> moves({Direction::UP,Direction::RIGHT,Direction::DOWN,Direction::LEFT});
return moves;
}
现在程序按预期工作