5

我有一个类并想创建一个 const int 变量,但该变量的值在类的构造函数中对我不可用。

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

代码如下 [Just a ProtoType] :

档案:啊

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

4

5 回答 5

12

一个小例子:

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

private:
  const int a;
  int initial_value_of_a() { return 5; /* some computation here */ };
};
于 2012-07-20T08:45:41.683 回答
5

const并不意味着您只能分配一次,您永远不能分配给 const 对象。一个 const 变量被初始化一次,它的值不能改变。因此,您在构造函数中对其进行初始化,当所有成员和基都已初始化时,之后您将无法更改它。

如果您无法在构造时获得值,您可以将变量设为非 const,因此您对其进行修改,或者您可以延迟构造直到拥有所有数据,使用占位符直到构造真实对象。

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

于 2012-07-20T08:34:08.133 回答
4

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

如果你只想设置一次变量,那么你可以使是非常量的,并添加一个保护,所以它只能设置一次。这不漂亮,但它会工作:

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

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

于 2012-07-20T08:29:40.720 回答
0

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

但它不会是相同的功能,因为它将是 const 指针而不是值:/

于 2012-07-20T08:46:12.160 回答
0

我想我需要改变设计,我应该以任何方式计算(或获取)构造函数中的 const 变量值。因为我以后无法设置它的值。

于 2012-07-22T12:49:03.810 回答