私有变量的读取时间晚于成员初始化列表?
private variables are read later than member init list?
我有这个class:
class IPianoRoll : public IControl
{
private:
int x, y;
int w = 30 * numStep + 1;
int h = 8 * numSemitones + 1;
int o = 5;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY) : IControl(pPlug, IRECT(pX, pY, pX + o + w + o, pY + o + h + o)) {
x = pX;
y = pY;
}
}
但私有变量值似乎比成员初始化列表可用"later"。所以 o
、w
和 h
不是用我的值初始化的,它采用不同的值。
有没有办法预初始化私有变量?
class 成员的访问说明符不相关。 与相关的是它们在class 声明中出现的顺序。 Class 成员按 顺序初始化。
依赖 class 成员的特定初始化顺序是非常危险的,因为错误的重构者可以在头文件中对它们重新排序而幸福地不知道源文件依赖于特定的顺序。
您还应注意,读取未初始化变量的行为是未定义的。
先构造Baseclasses(如果有多个baseclasses则从左到右),然后按照声明的顺序构造成员变量(不是任何成员初始值设定项列表中的顺序)。
然而,这仅适用于 非静态 成员变量。从您的示例来看,w
、h
和 o
是适用于 class 的所有实例的常量。因此,您只需将 class 更改为:
class IPianoRoll : public IControl
{
private:
int x, y;
static const int w = 30 * numStep + 1;
static const int h = 8 * numSemitones + 1;
static const int o = 5;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY)
: IControl(pPlug, IRECT(pX, pY, pX + o + w + o, pY + o + h + o))
, x(pX)
, y(pY)
{
}
};
一切都会好起来的。请注意,我已将设置 x 和 y 移动到成员初始化列表中。
如果您希望变量为非静态变量(以便稍后可以针对 class 的不同实例更改它们),那么我会这样写:
class IPianoRoll : public IControl
{
private:
int x, y;
static const int w_default = 30 * numStep + 1;
static const int h_default = 8 * numSemitones + 1;
static const int o_default = 5;
int w = w_default;
int h = h_default;
int o = o_default;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY)
: IControl(pPlug, IRECT(pX, pY, pX + o_default + w_default + o_default,
pY + o_default + h_default + o_default))
, x(pX)
, y(pY)
{
}
};
我有这个class:
class IPianoRoll : public IControl
{
private:
int x, y;
int w = 30 * numStep + 1;
int h = 8 * numSemitones + 1;
int o = 5;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY) : IControl(pPlug, IRECT(pX, pY, pX + o + w + o, pY + o + h + o)) {
x = pX;
y = pY;
}
}
但私有变量值似乎比成员初始化列表可用"later"。所以 o
、w
和 h
不是用我的值初始化的,它采用不同的值。
有没有办法预初始化私有变量?
class 成员的访问说明符不相关。 与相关的是它们在class 声明中出现的顺序。 Class 成员按 顺序初始化。
依赖 class 成员的特定初始化顺序是非常危险的,因为错误的重构者可以在头文件中对它们重新排序而幸福地不知道源文件依赖于特定的顺序。
您还应注意,读取未初始化变量的行为是未定义的。
Baseclasses(如果有多个baseclasses则从左到右),然后按照声明的顺序构造成员变量(不是任何成员初始值设定项列表中的顺序)。
然而,这仅适用于 非静态 成员变量。从您的示例来看,w
、h
和 o
是适用于 class 的所有实例的常量。因此,您只需将 class 更改为:
class IPianoRoll : public IControl
{
private:
int x, y;
static const int w = 30 * numStep + 1;
static const int h = 8 * numSemitones + 1;
static const int o = 5;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY)
: IControl(pPlug, IRECT(pX, pY, pX + o + w + o, pY + o + h + o))
, x(pX)
, y(pY)
{
}
};
一切都会好起来的。请注意,我已将设置 x 和 y 移动到成员初始化列表中。
如果您希望变量为非静态变量(以便稍后可以针对 class 的不同实例更改它们),那么我会这样写:
class IPianoRoll : public IControl
{
private:
int x, y;
static const int w_default = 30 * numStep + 1;
static const int h_default = 8 * numSemitones + 1;
static const int o_default = 5;
int w = w_default;
int h = h_default;
int o = o_default;
public:
IPianoRoll(IPlugBase* pPlug, int pX, int pY)
: IControl(pPlug, IRECT(pX, pY, pX + o_default + w_default + o_default,
pY + o_default + h_default + o_default))
, x(pX)
, y(pY)
{
}
};