可以const的类的成员变量的方法,而不是构造函数初始化?(Can const member var

2019-07-30 12:27发布

我有一个类,并希望创建一个const int变量但是对于变量的值是不提供给我在类的构造函数。

在类的初始化方法我得到的值。 我可以给它分配在方法? 由于我赋予它只有一次(为const说的),为什么它不工作?

代码如下[只是个雏形]:

文件:啊

Class A
{
  private :
  const long int iConstValue;

  public :
  A();
  initClassA();
}

文件:A.cpp

A::A()
{
 //CanNot initialize iConstValue (Don't have it)
}

A::initClassA(some params)
{
 // calculation according to params for iConstValue
 iConstValue = (some value)
}

这是行不通的。 有人有什么解决方案?

注:不能为iconstValue在构造函数中以任何方式获取价值 ,因为有一些限制。 所以请不要建议这样做。

Answer 1:

一个小例子:

class A
{
public:
  A():a(initial_value_of_a()) {}

private:
  const int a;
  int initial_value_of_a() { return 5; /* some computation here */ };
};


Answer 2:

const并不意味着你只能为它分配一次,你永远无法分配给一个const对象。 一个const变量初始化一次,它的值不能改变。 所以,你初始化它在构造函数中,当所有成员和基地被初始化,那么你就不能以后改变它。

如果你不能得到建筑的价值,你既可以把这些变量非const,所以你修改它,也许你会耽误施工,直到你把所有的数据,使用一个占位符,直到您构建真正的对象。

两期工程是一个代码的气味,它是用const的成员肯定是不相容的。



Answer 3:

你不能这样做,因为你不能改变一个const变量的值。 由时间initClassA运行常量数据成员已经(在这种情况下一些垃圾值)初始化。 所以,你可以将数据成员才真正初始化在构造函数初始化列表中的某些值。

如果你想设置的变量只有一次,那么你可以做的非常量,并增加保护,因此只能设置一次。 这是不漂亮,但它的工作:

class A
{
  private :
   long int iValue;
   bool isInitialised;

  public :
  A() : iValue(0), isInitialized(false);
  bool initClassA() {
    if (isInitialized) return false;
    iValue = something:
    isInitialized = true;
    return true;
  }
}

但它不是很好的做法,可以初始化或不是对象。 对象应该是一个连贯的国家建构的时候,和客户不应该检查这些对象是否被初始化。



Answer 4:

也许你可以做什么,是改变一个INT指针,在构造函数接收该指针,并更改您要指针:P

但它不会是相同的functionnality原因这将是指针,有const不再值:/



Answer 5:

我想我需要改变设计,我应该在构造函数计算(或获得)const的变量值的任何方式。 由于没有办法,我可以设置它的价值更高版本。



文章来源: Can const member variable of class be initialized in a method instead of constructor?