0

嘿,我正在尝试从在构造函数中初始化我的变量切换到使用构造函数初始化程序列表。

所以不要写

Class::Class(int width, int height) {
  this->width = width;
  this->height = height;
}

我正在这样做:

Class::Class(int width, int height) : 
  width(width), 
  height(height) {
}

一切正常,但现在我的问题......假设我有以下构造函数:

Class::Class(int width, int height) {
  this->width = width;
  this->height = height;
  this->state.setCurrState(this->state.stateMenu);
  this->state.setPrevState(this->state.getCurrState());
}

“状态”只是我在标题中创建的“状态”类的一个对象。函数 setCurrState 和 setPrevState 是 void 类型,只是设置类的私有变量。

如何转换构造函数?我知道可以在初始化器列表中编写函数,但是我想添加的函数不返回任何内容......它们是无效的,所以我不知道我会如何调用它们?

Class::Class(int width, int height) :
  width(width), 
  height(height) 
  // call functions here... but how?
  {
}

非常感谢我希望你能帮助我<3

4

4 回答 4

3

至少在您的情况下,在初始化程序列表中调用这些函数没有额外的点和优势。

只需在构造函数主体中调用它们。


重要的提示:

你说state的是成员Class。所以在构造函数的层面上,state还没有构造,那么自己构造它在某种程度上是没有意义的:

state.setCurrState(state.stateMenu);
state.setPrevState(state.getCurrState());

尝试为state的类编写一个良好的构造函数以将 curr/prev 设置为初始状态。

于 2013-09-27T15:10:18.950 回答
0

setCurrState并且setPrevState没有正式初始化您的state对象,它们只是在初始化后更改它的“状态”(没有双关语)。

如果您认为它们在语义上初始化您的状态对象,那么您不妨通过将它们合并到状态的构造函数中来形式化它(它应该接收所需的状态并立即设置它们)。然后,您可以在初始化程序列表中对其进行初始化。

于 2013-09-27T15:23:11.910 回答
0

简单的解决方案:将初始化函数留在构造函数的主体中。

稍微困难的解决方案:

  • 将构造函数添加到 State 以从参数对其进行初始化。
  • 编写返回要传递给 State 构造函数的值的新函数。

  • 于 2013-09-27T15:09:04.070 回答
    0

    添加一个返回 a 的函数State

    State GiveMeAState() {
      State state;
      state.setCurrState(state.stateMenu);
      state.setPrevState(state.getCurrState());
    }
    

    并在您的初始化列表中使用它:

    Class::Class(int width, int height) : 
      width(width), 
      height(height),
      state(GiveMeAState()) {
    }
    
    于 2013-09-27T15:38:22.267 回答