可以在一个方法而不是构造函数中初始化类的const成员变量吗?
我有一个类,并且想要创建一个const int变量,但该变量的值在类的构造函数中不可用。可以在一个方法而不是构造函数中初始化类的const成员变量吗?
在类的初始化方法中,我获取值。我可以用这种方法分配吗? 因为我只给它分配一次(正如const所说)为什么它不起作用?
代码为如下[只是个雏形]:
文件: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获得价值构造因为有一些限制。所以请不要这样做。
一个小例子:
class A
{
public:
A():a(initial_value_of_a()) {}
private:
const int a;
int initial_value_of_a() { return 5; /* some computation here */ };
};
你不能这样做,因为你不能改变const变量的值。到initClassA
运行时,const数据成员已经被初始化(在这种情况下为一些垃圾值)。所以你只能在构造函数初始化列表中真正地将数据成员初始化为某个值。
如果你想只设置一次变量,那么你可以使非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;
}
}
但它不是很好的做法,可以初始化或不是对象。对象在构建时应处于连贯状态,客户端不必检查这些对象是否已初始化。
那么有什么替代呢,我想要一个类中的long int,一旦赋值,就不应该改变它。 – EngineeredBrain 2012-07-20 08:36:40
@AnwarShaikh另一种方法是只给予变量的const访问权限。 – juanchopanza 2012-07-20 08:38:31
我会建议抛出一个异常,如果init函数被调用两次,可能从std :: logic_error派生。如果程序确实损坏了。 – 2012-07-20 09:08:40
const
并不意味着你只能为它分配一次,就可以永远分配给一个const对象。一个const变量被初始化一次,其值不能改变。所以你在构造函数中初始化它,当所有的成员和基础都被初始化时,那么在那之后你不能再改变它。
如果你不能获得构造的价值,你可以使变量非const,所以你修改它,或者你可以延迟建设,直到你有所有的数据,使用占位符,直到你构建真正的目的。
两阶段构造是一种代码异味,它肯定与const成员不兼容。
在我的场景中,类有一个孩子,必须在其构造上实例化类对象。但是,孩子有一个原始数据(需要处理以获取const值)那么我该如何推迟父类的实例化。 – EngineeredBrain 2012-07-20 08:42:27
我不明白那条评论。什么类的对象?什么原始数据?你能否改变你的问题来清楚你的意思?你需要改变你的设计,为什么不能成为非const? – 2012-07-20 09:02:44
也许你可以做什么,是一个INT指针的变化,收到此指针在构造函数,并更改您要指针:P
但将不会是相同的功能性,因为它将是指针,这是常量,不再是价值:/
我想我需要改变设计,我应该计算(或获取)const变量值在构造函数怎么样。因为我以后无法设置它的价值。
请不要添加“谢谢”作为答案。相反,投票答案,你觉得有帮助。 – Constantin 2014-04-02 07:53:12
“我只给它分配一次(如const所说)” - const并没有说你可以分配一次。 const说你根本不能指定它(但你可以初始化它)。赋值和初始化是不同的事情,你尝试的是赋值。 – 2012-07-20 08:32:50
为什么你的类需要'iConstValue'是'const'?也许你的设计需要重新评估? – Aesthete 2012-07-20 08:39:09
当时的课程设计有缺陷。你*应该*能够在构造函数中获得值,否则你的对象没有被正确初始化,并且初始化是构造函数的工作。 – 2012-07-20 08:40:37