2016-07-11 5 views
0

ich MIDITest meiner Klasse haben, die eine Membervariable Objekt bekam IPianoRoll genannt:Wie initiiere ich ein Objekt in einem CTOR nach einigen anderen Aufgaben?

class MIDITest : public IPlug 
{ 
private: 
    IPianoRoll mPianoRoll; 

public: 
    MIDITest(IPlugInstanceInfo instanceInfo); 
    ~MIDITest(); 
}; 

ich meine benutzerdefinierte CTOR von mPianoRoll aufrufen müssen:

IPianoRoll(IPlugBase *pPlug, int x, int y, int paramIdx) : IControl(pPlug, IRECT(x, y, x + kWidth, y + kHeight), paramIdx, IChannelBlend::kBlendColorDodge) { 

} 

erst nach einer anderen Aufgabe innerhalb MIDITest, wie wie:

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); 
} 

aber natürlich kann ich nicht tun mPianoRoll(this, 8, 8, kParamIDPianoRoll);.

Ich würde Zeiger für diese zu vermeiden, da beim "Löschen" ich seltsame Fehler bekam, und weil (da ich keine Zeiger brauche), denke ich, es ist besser, sie nicht zu verwenden und dynamische Speicherzuweisung.

Ich kann Member Init Liste nicht verwenden, da es vor dem Task innerhalb der MIDITest CTOR aufgerufen/verwendet wird.

Wie ist der Weg?

+1

Der Code, den du zeigst, ist eigentlich nichts, von dem die Konstruktion von 'mPianoRoll' abhängt, soweit ich das sehen kann. Vielleicht "kParamIDPianoRoll" was auch immer das ist? –

+1

Ich verstehe es nicht. [MCV] (http://stackoverflow.com/help/mcve) bitte? –

Antwort

1

Wenn der Bau von mPianoRoll auf einige der „Aufgaben“ ab, die Sie im Konstruktor ausführen, dann verwenden Sie könnten einfach den Zuweisungsoperator und tun z.B.

mPianoRoll = IPianoRoll(this, 8, 8, kParamIDPianoRoll); 

Eine andere mögliche Lösung ist es, die „Aufgaben“ separate Klassen zu machen und Instanzen von ihnen in der MIDITest Klasse oder MIDITest erben von ihnen (als mixins) haben, und verwenden Sie die Liste Bau initializer für alle Initialisierung und Aufgaben , endet mit der mPianoRoll Konstruktion in der Liste.

+0

Ich mag den ersten Weg. Aber wenn ich es versuche, heißt es "IControl": kein geeigneter Standardkonstruktor verfügbar. Weil "Klasse IPianoRoll: öffentliche IControl" denke ich. "IControl" ist von einem Rahmen, ich kann es nicht berühren. Was soll ich hinzufügen? – markzzz

1

Sie könnten die anderen Aufgaben in eine Basisklasse verschieben. Basisklassenkonstruktoren werden zuerst verarbeitet.

Sie könnten sie auch in eine Funktion verschieben, einen Wert zurückgeben und damit ein anderes Element in der Initialisierungsliste explizit initialisieren.

Sonst scheint es die andere Aufgaben sind etwas, von dem die Elementvariable abhängt, daher kann es sinnvoll sein, es innerhalb dieser Elementvariable zu verschieben, oder in einem Wrapper-Objekt (das wäre dann normal initialisiert).

0

Eine Möglichkeit besteht darin, mPianoRoll mit so vielen Informationen wie in der Initialisierungsliste zu initialisieren und dann seinen Status im Rumpf des Konstruktors zu aktualisieren.

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); 
}