我有一个类,想要创建一个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值,因为存在一些限制。所以请不要建议那样做。
答案 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变量值。因为我无法在以后设定它的价值。