c ++:static const初始化顺序

时间:2014-11-19 14:26:40

标签: c++11 static

我在按正确顺序初始化静态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;
}

现在程序按预期工作

0 个答案:

没有答案