C++ 在完成一些其他任务后,如何在一个CTOR中初始化一个对象?
我有一个类C++ 在完成一些其他任务后,如何在一个CTOR中初始化一个对象?,c++,oop,object,initialization,C++,Oop,Object,Initialization,我有一个类MIDITest,它有一个名为ipianroll的成员变量对象: class MIDITest : public IPlug { private: IPianoRoll mPianoRoll; public: MIDITest(IPlugInstanceInfo instanceInfo); ~MIDITest(); }; IPianoRoll(IPlugBase *pPlug, int x, int y, int paramIdx) : IControl
MIDITest
,它有一个名为ipianroll
的成员变量对象:
class MIDITest : public IPlug
{
private:
IPianoRoll mPianoRoll;
public:
MIDITest(IPlugInstanceInfo instanceInfo);
~MIDITest();
};
IPianoRoll(IPlugBase *pPlug, int x, int y, int paramIdx) : IControl(pPlug, IRECT(x, y, x + kWidth, y + kHeight), paramIdx, IChannelBlend::kBlendColorDodge) {
}
我需要调用我的自定义CTORmpianroll
:
class MIDITest : public IPlug
{
private:
IPianoRoll mPianoRoll;
public:
MIDITest(IPlugInstanceInfo instanceInfo);
~MIDITest();
};
IPianoRoll(IPlugBase *pPlug, int x, int y, int paramIdx) : IControl(pPlug, IRECT(x, y, x + kWidth, y + kHeight), paramIdx, IChannelBlend::kBlendColorDodge) {
}
仅在MIDITest
中的某些其他任务之后,例如:
MIDITest::MIDITest(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(kNumParams, kNumPresets, instanceInfo) {
// SOME TASKS
IGraphics *pGraphics = MakeGraphics(this, GUI_WIDTH, GUI_HEIGHT, PLUG_FPS);
pGraphics->HandleMouseOver(true);
AttachGraphics(pGraphics);
// NOW I NEED TO "create it"
mPianoRoll(this, 8, 8, kParamIDPianoRoll);
}
但我当然不能做mpianroll(这个,8,8,kParamIDPianoRoll)代码>
我想避免使用指针,因为在“删除”时我会出现奇怪的错误,而且(因为我不需要指针),我想最好不要使用它们和动态内存分配
我不能使用Member Init List,因为它将在MIDITest
CTOR中的任务之前调用/使用
方法是什么?您可以将其他任务移动到基类中。基类构造函数将首先得到处理
您还可以将它们移动到函数中,使其返回值,并使用它显式初始化初始化列表中的另一个成员
否则,其他任务似乎是成员变量所依赖的,因此将其移动到该成员变量内或包装器对象内(通常会初始化)是有意义的。您可以将其他任务移动到基类中。基类构造函数将首先得到处理
您还可以将它们移动到函数中,使其返回值,并使用它显式初始化初始化列表中的另一个成员
否则,其他任务似乎是成员变量所依赖的,因此将其移动到该成员变量内或包装器对象内(通常会初始化)是有意义的.一个选项是使用初始值设定项列表中的尽可能多的信息初始化mpianroll
,然后在构造函数体中更新其状态
MIDITest::MIDITest(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(kNumParams, kNumPresets, instanceInfo),
mPianoRoll(this, 8, 8, <not sure what this would be> {
// SOME TASKS
IGraphics *pGraphics = MakeGraphics(this, GUI_WIDTH, GUI_HEIGHT, PLUG_FPS);
pGraphics->HandleMouseOver(true);
AttachGraphics(pGraphics);
// update the state of mPianoRoll.
mPianoRoll->someSetFunction(kParamIDPianoRoll);
}
MIDITest::MIDITest(IPlugInstanceInfo instanceInfo):IPLUG_CTOR(kNumParams、kNumPresets、instanceInfo),
MPIANOOLL(这个,8,8{
//一些任务
IGraphics*pGraphics=MakeGraphics(这是图形用户界面宽度、图形用户界面高度、插件FPS);
pGraphics->HandleMouseOver(正确);
附图;
//更新mpianroll的状态。
mpianroll->someSetFunction(kParamidPianOrll);
}
一个选项是使用初始值设定项列表中的尽可能多的信息初始化mpianroll
,然后在构造函数体中更新其状态
MIDITest::MIDITest(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(kNumParams, kNumPresets, instanceInfo),
mPianoRoll(this, 8, 8, <not sure what this would be> {
// SOME TASKS
IGraphics *pGraphics = MakeGraphics(this, GUI_WIDTH, GUI_HEIGHT, PLUG_FPS);
pGraphics->HandleMouseOver(true);
AttachGraphics(pGraphics);
// update the state of mPianoRoll.
mPianoRoll->someSetFunction(kParamIDPianoRoll);
}
MIDITest::MIDITest(IPlugInstanceInfo instanceInfo):IPLUG_CTOR(kNumParams、kNumPresets、instanceInfo),
MPIANOOLL(这个,8,8{
//一些任务
IGraphics*pGraphics=MakeGraphics(这是图形用户界面宽度、图形用户界面高度、插件FPS);
pGraphics->HandleMouseOver(正确);
附图;
//更新mpianroll的状态。
mpianroll->someSetFunction(kParamidPianOrll);
}
如果
mpianroll
的构造取决于您在构造函数中执行的某些“任务”,那么您可以简单地使用赋值运算符并执行以下操作:
mPianoRoll = IPianoRoll(this, 8, 8, kParamIDPianoRoll);
另一种可能的解决方案是将“任务”划分为不同的类,并在
MIDITest
类中拥有它们的实例,或者从它们继承MIDITest
(as),并对所有初始化和任务使用构造初始值设定项列表,以列表中的mpianroll
构造结尾。如果mpianroll
的构造取决于您在构造函数中执行的某些“任务”,则您可以简单地使用赋值运算符并执行以下操作:
mPianoRoll = IPianoRoll(this, 8, 8, kParamIDPianoRoll);
另一种可能的解决方案是将“任务”划分为不同的类,并在
MIDITest
类中拥有它们的实例,或者从它们继承MIDITest
(as),并对所有初始化和任务使用构造初始值设定项列表,以列表中的mpianroll
构造结尾。据我所知,您显示的代码实际上并不包含构造mpianroll
所依赖的任何内容。也许kParamIDPianoRoll
这是什么?我不明白d、 请?据我所知,您显示的代码实际上并不是构造mpianroll
所依赖的任何东西。也许kParamIDPianoRoll
不管是什么?我不明白。请?我喜欢第一种方式。但当我尝试时,它会说'IControl':没有合适的默认构造函数可用class-ipianroll:public-IControl
我猜。IControl
来自一个框架,我不能碰它。我应该添加什么?我喜欢第一种方法。但是当我尝试时,它会说'IControl':没有合适的默认构造函数可用。class-ipianroll:public-IControl
我猜。IControl
来自一个框架框架,我不能碰它。我应该添加什么?