初始化对象数据成员C ++

时间:2016-11-20 02:09:40

标签: c++ constructor initialization

请考虑以下代码:

class Game {
private:
  vector<SomeType*> vec;
  OtherType obj;

public:
  Game(char* configuration_file);
};

考虑到vec和obj都依赖于configuration_file内容,应该如何实现Game构造函数?

初始化列表是不可能使用的,因为在构造vec和obj之前必须解析configuration_file。

如果我将在构造函数体内构造vec和obj,那么两个默认构造函数都会被调用,有没有办法防止这种情况?

做这种事情的正常方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

默认构造向量肯定是无害的,所以让我们假设默认构造的OtherType是不可能的。然后我会这样处理它:

class Game {
private:
  vector<SomeType*> vec;
  OtherType obj;

  static OtherType load(const char* config_file);

public:
  Game(const char* config_file)
    : obj(load(config_file))
  {
    // populate vec here
  }
};

答案 1 :(得分:0)

有时候,为了得到一个人的目的,你必须稍微绕道而行。

首先,编写一个静态私有函数:

std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file)
{
  // ...
}

这是一个私有静态函数,可以将配置文件解析为这种数据。

现在,您可以将这个拼图游戏放在一起:

class Game_config {

protected:

  vector<SomeType*> vec;
  OtherType obj;

  Game_config(const std::pair<std::vector<SomeType *>, OtherType> &);
};

class Game : private Game_config {

    static std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file);

public:
  Game(char* configuration_file) : Game_config(parse_config_file())
  {
  }
};

Game_config的构造函数应该是显而易见的。

上述内容的一个细微变化是让parse_config_file()返回Game_config超类,并让Game的构造函数复制构造其超类。在这个用例中,现代编译器应该能够使用RVO。