在C ++中,我有一个带有一些const字段的类:
class Obj {
static const AType defaultAType;
const AType &cRef;
public:
Obj() : cRef(defaultAType) { ... }
Obj(AType &aType) : cRef(aType) { ... }
};
这是一个简单的例子。但真正的一个可能有许多字段,以及几个不同的构造函数重载。参考文献和" const"在我所知的情况下,不能在构造函数的主体或构造函数调用的方法中初始化字段。但是,同步维护一些初始化器是一种痛苦,比如5个单独的构造函数重载。有没有办法正确分解这些初始化器(宏除了)??
答案 0 :(得分:3)
在评论中,你说,
是的,这是结构,但是const项,引用和类项不能在构造函数体中或非构造函数方法中初始化。
delegating constructor可用于初始化引用成员变量。
稍微扩展您的示例代码,我可以看到类似的内容:
class Obj {
static const AType defaultAType;
const AType &aRef;
static const BType defaultBType;
const BType &bRef;
public:
// Delegate with default values for both references
Obj() : Obj(defaultAType, defaultBType) {}
// Delegate with default value for the B reference
Obj(AType &aType) : Obj(aType, defaultBType) {}
// Delegate with default value for the A reference
Obj(BType &bType) : Obj(defaultAType, bType) {}
// A constructor that has all the arguments.
Obj(AType& aType, BType& bType) : aRef(aType), bRef(bType) {}
};
答案 1 :(得分:0)
所以这是一个限制,你不能在构造函数之外初始化const变量,所以我脑子里有一种方法。你可以有一个重载的构造函数,其中所有可能的变量类型都作为参数,最后一个参数是整数,表示在每次重载时考虑一个变量时需要注意的参数。所以你可以做这样的事情。希望这个有所帮助。您可以增加要初始化的变量数。
请注意只是将null传递给未考虑的引用。
class Obj {
const typea var1;
const typeb var2;
const typec var3;
const typed var4;
public Obj(typea * ptr1, typeb * ptr2, typec * ptr3, typed * ptr4, int index) {
switch (index) {
case 1:
var1 = * ptr1;
break;
case 2:
var2 = * ptr2;
break;
case 3:
var3 = * ptr3;
break;
case 4:
var4 = * ptr4;
break;
}
}
}

答案 2 :(得分:0)
没有。除非你使用C ++ 11,否则你可以在类定义中初始化其中的一些:
struct B
{
B(int) {}
constexpr B(double) {}
};
class A
{
const B b1 = 1;
static constexpr B b2 = 2.0;
};
对于从构造函数输入参数构造的const值,您需要使用initializer list。