【问题标题】:C++ class const member intialization within constructor body构造函数体内的 C++ 类 const 成员初始化
【发布时间】:2021-09-04 12:54:10
【问题描述】:

我在初始化 const 类成员时遇到问题。 在const成员初始化之前,我必须做很多计算,所以我不能使用这个语法

Class::Class(int value) : value(value) {}

我希望在构造函数体中初始化成员,例如:

Class::Class(int value) {
  if (Function1(value)) {
    this->value = value;
    Function2(&this->value);
  }
  else
    this->value = value * 2;
}

有可能吗? 希望得到您的帮助!

【问题讨论】:

  • 您可以编写一个带有static preprocess(int value) 之类签名的辅助函数,然后成员初始化语法将类似于Class::Class(int value) : value(preprocess(value)) { }。虽然我对 Function2 的东西持怀疑态度,但它似乎不涉及初始化类,并且可能会使设计这样的功能更加困难。

标签: c++ class constructor constants member


【解决方案1】:

将所有计算汇总到一个静态计算函数中。

struct Class {
    static int calcValue(int value) {
        if (Function1(value) {
            Function2(&value);
            return value;
        }
        return value * 2;
    }

    Class(int val)
        : value(calcValue(val))
    {}
};

【讨论】:

  • 您已将静态方法函数参数的引用传递给 Function2,这与传递对类成员的引用不同,尽管根据 OP 它是 const,所以它不应该问题。
  • @Mansoor 我假设Function2 在我们返回之前会更改value。我不认为它存储指针。如果不是这样,OP 可以让我们知道。
  • 不确定,在这种情况下,您将在设置类成员之前更改值,而在 OP 的示例中,他首先设置成员变量,然后将其传递给 Function2
  • @Mansoor 最终结果应该是一样的,对吧?在设置之前改变值或之后改变成员变量
  • 对不起,我没看q。小心,如果成员是 const,那么 Function2 必须接受一个 const ref,所以它不能改变任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
相关资源
最近更新 更多