const字段的复杂初始化

Rom*_*kov 11 c++ initialization const ctor-initializer

考虑像这样的一个类:

class MyReferenceClass
{
public:
    MyReferenceClass();
    const double ImportantConstant1;
    const double ImportantConstant2;
    const double ImportantConstant3;
private:
    void ComputeImportantConstants(double *out_const1, double *out_const2, double *out_const3);
}
Run Code Online (Sandbox Code Playgroud)

有一个例程(ComputeImportantConstants)在运行时计算三个常量.假设计算相当复杂,并且固有地一次产生所有三个值.此外,结果取决于构建配置,因此硬编码结果不是一种选择.

有没有一种合理的方法将这些计算值存储在类的相应const双字段中?

如果没有,你能建议一种更自然的方式在C++中声明这样的类吗?

在C#中,我会在这里使用带有静态构造函数的静态类,但这不是C++中的一个选项.我也考虑过使用非const字段或函数调用使ImportantConstant1..3,但两者都显得逊色.

我发现初始化const字段的唯一方法是使用初始化列表,但似乎不可能在这样的列表中传递多输出计算的结果.

whe*_*ies 9

你为什么不能这样做:

MyReferenceClass ComputeImportantConstants(){
    //stuff to compute
    return MyReferenceClass( const1, const2, const3 );
}

MyReferenceClass{
public:
    MyReferenceClass(double _1, double _2, double _3) 
        : m_Const1(_1),
        m_Const2(_2),
        m_Const3(_3){}

    double getImportantConst1() const { return m_Const1; }
    double getImportantConst2() const { return m_Const2; }
    double getImportantConst3() const { return m_Const3; }
private:
    const double m_Const1,
                 m_Const2,
                 m_Const3;
};
Run Code Online (Sandbox Code Playgroud)

像这样,并将计算功能变成工厂功能?

  • @Chris:如果你看一下变化历史,你会发现大约两年前*是*一个const double.;-) (2认同)

Tob*_*ner 5

首先 - 你可以做恶:在ComputeImportantConstants()中抛弃const并将值放在那里.不要这样做,因为那时你撒谎到编译器,它会试图找到最糟糕的回报方式.

第二:

做这样的事情:

class A
private:
  double important1;
  double important2;
  double important3;
  A() { ComputeImportantConstants(); } //no need for parameters, it accesses the members
  void ComputeImportantConstants();
public:
  inline double GetImportant1() { return important1; }
  inline double GetImportant2() { return important2; }
  inline double GetImportant3() { return important3; }
};
Run Code Online (Sandbox Code Playgroud)

你仍然可以通过使它成为某种单独的单元来改进这个类(因为你想要只进行一次计算).