Mehrere Instanzen einer Dokumentenklasse?



  • Ich habe eine Klasse die Quasi mein Dokument darstellt, in meinem Fall die Klasse 'PhaseObject'.

    Jetzt möchte ich, dass der Nutzer beliebig viele Instanzen davon erzeugen kann. Aber gleichzeitig muss ich diese Instanzen eindeutig voneinander unterscheiden können.

    Wie macht man das am cleversten unter C++?

    Matthias



  • vergleich die adresse aufm heap, die wird sich bei verschiedenen instanzen immer unterscheiden.

    eine high level lösung wäre es z.b. einfach in der klasse eine statische zählervariable mitzuführen, die im konstruktor inkrementiert und einer lokalen variable zugewiesen wird.



  • thordk schrieb:

    eine high level lösung wäre es z.b. einfach in der klasse eine statische zählervariable mitzuführen, die im konstruktor inkrementiert und einer lokalen variable zugewiesen wird.

    Schlecht beim zur Zeit so beliebten multifredding



  • möhpmöhp schrieb:

    thordk schrieb:

    eine high level lösung wäre es z.b. einfach in der klasse eine statische zählervariable mitzuführen, die im konstruktor inkrementiert und einer lokalen variable zugewiesen wird.

    Schlecht beim zur Zeit so beliebten multifredding

    wer multiferkelt solls vorher sagen 😃



  • möhpmöhp schrieb:

    thordk schrieb:

    eine high level lösung wäre es z.b. einfach in der klasse eine statische zählervariable mitzuführen, die im konstruktor inkrementiert und einer lokalen variable zugewiesen wird.

    Schlecht beim zur Zeit so beliebten multifredding

    Und wie macht man es dann? Es ist ja ein altägliches Problem.

    Matthias



  • thordk schrieb:

    vergleich die adresse aufm heap, die wird sich bei verschiedenen instanzen immer unterscheiden.



  • möhpmöhp schrieb:

    thordk schrieb:

    vergleich die adresse aufm heap, die wird sich bei verschiedenen instanzen immer unterscheiden.

    Damit kann ich Dokumente unterscheiden, aber nicht zuordnen. Ich möchte aber wissen wie ich Dokument Nr '3' bekomme.

    Zudem ist mir die implementierung noch vollkommen unklar.

    Wenn ich eine Klasse initialisiere ist die Variable vergeben. Wie erzeuge ich dann eine neue instanz?

    Matthias





  • Ich habe jetzt folgendes Probiert:

    public:
    	vector<QPhaseObject> PhaseObject;
    
    void MainWindow::NewPhaseObject()
    {
    	PhaseObject.resize(PhaseObject.size() + 1);
    	dlgConfigurePhaseObject = new DialogConfigurePhaseObject;
    	dlgConfigurePhaseObject->show();
    	dlgConfigurePhaseObject->SetPhaseObject( & PhaseObject[PhaseObject.size()]);	
    }
    
    void DialogConfigurePhaseObject::SetPhaseObject(QPhaseObject *newPhaseObject)
    {
    	PhaseObject = newPhaseObject;
    }
    

    Wird dabei eigentlich der Konstruktor von PhaseObject aufgerufen wenn ich resize aufrufe?

    Abgesehen davon funktioniert das nicht:

    1>.\MainWindow.cpp(253) : error C2248: "DialogConfigurePhaseObject::SetPhaseObject": Kein Zugriff auf private Member, dessen Deklaration in der DialogConfigurePhaseObject-Klasse erfolgte.
    1> z:\cpp\qt\qbeamshaping\qbeamshaping\DialogConfigurePhaseObject.h(28): Siehe Deklaration von 'DialogConfigurePhaseObject::SetPhaseObject'
    1> z:\cpp\qt\qbeamshaping\qbeamshaping\DialogConfigurePhaseObject.h(13): Siehe Deklaration von 'DialogConfigurePhaseObject'

    Ich könnte die Variable PhaseObject natürlich auch außerhalb von der Klasse definieren und nicht übergeben, müsste dann aber jedesmal die MainWindow.h Datei einbinden die selber die Dialoge lädt und mit rekursiven inclusions habe ich sehr schlechte Erfahrungne gemacht.

    Wie mache ich also die Variable zu einem Objekt das ich entweder übergeben kann, oder so dass es global innerhalb aller Dialoge und Klasse verfügbar ist, ohne das ich .h Dateien laden muss die die eigene .h Datei wieder laden (daher rekursiv)?

    Matthias



  • Erstens: Ja, beim resize() wird der (Default)-Ctor für das neue Objekt aufgerufen - allerdings ist mir der Sinn dieser Konstruktion noch nicht ganz klar.
    (du legst per new einen neuen Dialog... an und übergibst diesem ein nicht existierendes (das letzte Element des vector's ist an Position 'size()-1') PhaseObject)

    Zweitens: Die Fehlermeldung besagt, daß die Methode SetPhaseObject() privat in der Klasse Dialog... ist und deshalb von MainWindow::NewPhaseObject() aus nicht erreichbar.



  • ich glaub du solltest dich erst mal richtig mit den grundlagen beschäftigen


Anmelden zum Antworten