Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在完成一些其他任务后,如何在一个CTOR中初始化一个对象?_C++_Oop_Object_Initialization - Fatal编程技术网

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) {

}
我需要调用我的自定义CTOR
mpianroll

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
来自一个框架框架,我不能碰它。我应该添加什么?