可以在方法而不是构造函数中初始化类的const成员变量吗?

时间:2012-07-20 08:28:22

标签: c++ class design-patterns initialization const

我有一个类,想要创建一个const int变量,但是在类的构造函数中我无法使用该变量的值。

在类的初始化方法中,我得到了值。我可以用该方法分配吗?  因为我只分配一次(如const所说)为什么它不起作用?

代码如下[Just a ProtoType]:

档案:A.h

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值,因为存在一些限制。所以请不要建议那样做。

5 个答案:

答案 0 :(得分:10)

一个小例子:

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

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

答案 1 :(得分:5)

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

如果你无法获得构造的值,你可以使变量非常量,所以你修改它,或者你可以延迟构造,直到你拥有所有数据,使用占位符,直到你构造真实对象

两阶段构造是代码气味,它肯定与const成员不兼容。

答案 2 :(得分:4)

您不能这样做,因为您无法更改const变量的值。在initClassA运行时,const数据成员已经初始化(在这种情况下为某些垃圾值)。因此,您只能在构造函数初始化列表中将数据成员初始化为某个值。

如果你只想设置变量一次,那么你可以make为非const,并添加一个guard,这样它只能设置一次。这不是很好,但它可以工作:

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

但是,拥有可以初始化的对象并不是一个好习惯。构造时,对象应处于连贯状态,客户端不必检查这些对象是否已初始化。

答案 3 :(得分:0)

也许你可以做的是改变一个int指针,在你的构造函数中接收这个指针,并将指针改为你想要的地方:P

但它不会是相同的函数,因为它将是const的指针,而不再是值:/

答案 4 :(得分:0)

我认为我需要更改设计,我应该在构造函数中计算(或获取)const变量值。因为我无法在以后设定它的价值。