请考虑以下代码:
class Game {
private:
vector<SomeType*> vec;
OtherType obj;
public:
Game(char* configuration_file);
};
考虑到vec和obj都依赖于configuration_file内容,应该如何实现Game构造函数?
初始化列表是不可能使用的,因为在构造vec和obj之前必须解析configuration_file。
如果我将在构造函数体内构造vec和obj,那么两个默认构造函数都会被调用,有没有办法防止这种情况?
做这种事情的正常方法是什么?
感谢。
答案 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。