【问题标题】:Function in constructor initialiser list?构造函数初始化列表中的函数?
【发布时间】:2013-10-03 22:45:54
【问题描述】:

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

所以不要写

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());
}

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

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

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

非常感谢你,希望你能帮助我

【问题讨论】:

  • State 是否有构造函数接收它们?
  • @chris State 构造函数不带参数,只有我提到的两个函数
  • 在不需要时使用this-> 非常丑陋和冗长。
  • @BartekBanachewicz:在询问者的编码风格中,这将有助于防止错误,因为除了 this-> 装饰之外,成员名称与常规局部变量名称没有区别。
  • @jxh 哦,你是对的;至少他正在切换到初始化列表并且问题消失了。

标签: c++ list constructor initialization initializer


【解决方案1】:

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

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


重要提示:

你说stateClass 的成员。所以在构造函数的层面上,state还没有被构造出来,那么自己构造它就毫无意义了:

罢工>

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

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

【讨论】:

    【解决方案2】:

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

    稍微困难的解决方案:

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

    • 谢谢,我会在构造函数中调用函数
    • 在这种情况下,“稍微困难的解决方案”不是一个选项。他正在使用作为该状态成员的值来设置状态,在构造该状态对象之前这些值是不可合法访问的。
    • 更难(笑)。新的构造函数必须“做正确的事”。事实上,如果它甚至可能不需要任何参数,在这种情况下,可以在 Class 的初始化列表中忽略 state
    • 将构造函数添加到State确实是唯一正确的解决方案。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      添加一个返回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()) {
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2017-03-07
        • 2012-04-11
        • 2017-05-02
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多