C++11 C++静态静态初始化顺序

C++11 C++静态静态初始化顺序,c++11,static,C++11,Static,我在以正确的顺序初始化静态常量字段时遇到问题。我首先要初始化方向,然后是方向向量: 文件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(con

我在以正确的顺序初始化静态常量字段时遇到问题。我首先要初始化方向,然后是方向向量:

文件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由静态初始值设定项块正确初始化

我希望这段代码能够打印U R D L,但它会打印,这表明字段没有初始化。这对我来说是相当困惑的,因为我故意将默认构造函数设置为私有,以避免这种空初始化

答复

根据Michael Burr的评论,我搜索并了解到应该用方法替换变量。在我的实现中,这看起来像:

const std::vector<Direction> & move_order() {
    static const std::vector<Direction> moves({Direction::UP,Direction::RIGHT,Direction::DOWN,Direction::LEFT});
return moves;
}

现在程序的工作原理与预期一样

只要常数的定义与复制构造函数的定义在同一个TU中,就应该可以了:初始化必须在调用TU中的第一个函数之前完成,并且向量初始化调用复制构造函数。嗯,我在示例代码中添加了显式复制构造函数,当我执行它时,它不会按照我的要求打印U R D L。它只打印表示向量中的对象未正确初始化的空间。我在我的帖子中还增加了一个问题。你是如何编译你的程序的?如果忘记编译Direction.cc,可能会导致这种行为,而不会出现任何编译器错误,因为头文件中已经正确定义了所有内容,即不会显示未定义的引用。只是一个想法,正如我所知,这是一个合成的例子。在调用move_order的ctor和调用各种静态方向对象的ctor之间有一个未指定的顺序,因为涉及两个不同的转换单元。看起来要先调用移动顺序。您需要研究C++静态对象初始化顺序问题的一般解决方案/替代方案。我确信已经有几个主题已经讨论过。@ TNORGD:您已经定义了复制构造函数内联,因此在定义静态成员常量的TU中没有唯一定义。尝试将其更改为不以内联方式定义。