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字段的唯一方法是使用初始化列表,但似乎不可能在这样的列表中传递多输出计算的结果.
你为什么不能这样做:
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)
像这样,并将计算功能变成工厂功能?
首先 - 你可以做恶:在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)
你仍然可以通过使它成为某种单独的单元来改进这个类(因为你想要只进行一次计算).
| 归档时间: |
|
| 查看次数: |
2095 次 |
| 最近记录: |