Zeiger auf andere Klassen



  • Hallo zusammen!

    Ich habe folgendes Problem mit MFC: Ich brauche von einer selbsterzeugten Klasse schreibend Zugriff auf Daten der Anwendung.

    Ich will, daß beim Klick auf einen Button eine Methode meiner Klasse aufgerufen wird:

    // AnwendungView.cpp
    ON_COMMAND(ID_BUTTON,OnObjektButton);
    ...
    void CAnwendungView::OnObjektButton()
    { CAnwendungDoc* pDoc = GetDocument(); 
      pDoc ->MeineKlasse.Berechnung();}
    
    Die Daten liegen aber als public in der Klasse AnwObject
    // AnwObject.h
    class CAnwObject
    { public:
       TYP Daten;
    ...
    
    // MeineKlasse.h
    class MeineKlasse
    { public:
        void Berechnung();
    ...
    
    // MeineKlasse.cpp
    void CMeineKlasse::Berechnung()
    {
    }
    

    Wie kann ich einen Zeiger auf AnwObject übergeben, so daß ich an die Daten herankomme? Bzw. wer kann mir eine gute Netzseite nennen, die sich mit so einem Thema auseinandersetzt (leider habe ich noch nicht die richtige dafür gefunden).

    Danke & CU
    Joe



  • Einfach nen pointer oder referenz darauf als parameter übergeben



  • Schonmal danke für deine Mühe, aber mein Problem ist das _Wie_.

    Vielleicht noch einmal genauer formuliert:
    Gegeben: "AnwObject" von Klasse CAnwObject
    mit "CArray <int,int> Daten;" als public

    Gesucht ist eine clevere Übergabe eines Zeigers in
    "CAnwendungView::OnObjektButton()"

    so daß ich in meiner Methode "Berechnung" meiner Klasse "MeineKlasse" auf die Einträge des CArrays von AnwObject (ala "Daten[i] = NeuBerechneterWert") zugreifen kann.

    Grundsätzlich vielleicht erst einmal die Frage:

    Übergibt man da pDoc von GetDocument() und greift auf die Daten in "CMeineKlasse::Berechnung()" über pDoc->AnwObject.Daten zu (was bei mir plötzlich zu Schwierigkeiten in AnwendungDoc.h an der Stelle, wo ich meine Klasse MeineKlasse als public in CAnwendungDoc einbinde, führt (error C2146 und error C2501) obwohl ich die seit langem nicht geändert habe)

    oder

    übergibt man da einen Zeiger auf das CArray (womit ich derzeit noch vor dem Problem stehe, wie das geht und wie ich dann an die Daten per Index herankommen)

    Ich hatte mit dem Gebiet bis dato noch nichts zu tun. Deshalb auch die Frage nach hilfreichen Netzseiten oder BeispielCode. (Ich kann mir nicht vorstellen, daß ein solches "Problem" noch nirgendwo auftrat und gelöst wurde...)

    CU
    Joe



  • Nachtrag: Inzwischen hab ich mit Hilfe des Internets die Übergabe des CArrays (hoffentlich richtig) so hinbekommen, daß keine Compile-Fehler mehr auftreten. Aber das Programm bricht bei der Testausgabe mit einem Laufzeitfehler (afxtempl.h line 298) ab.

    CArray <int,int> Daten;
    
    void CAnwendungView::OnObjektButton(){
    	CAnwendungDoc* pDoc = GetDocument();
    	pDoc->MeineKlasse.Berechnung((pDoc->AnwObject.Daten));
    }
    
    void CMeineKlasse::Berechnung(CArray <int, int> &input) {
       CString Msg;
       Msg.FormatMessage("Testausgabe: \n");
       for (int i = 0; i < input.GetSize(); i++) {
          Msg.AppendFormat("%i - %i \n",i,input[i]);
       }
       AfxMessageBox(Msg);
    }
    

    Was mache ich weiterhin falsch?
    Bliebe zudem weiterhin die Frage, ob es nicht besser wäre pDoc zu übergeben und per pDoc->AnwObject.Daten[i] darauf zuzugreifen.

    CU
    Joe



  • Soweit finde ich das ja OK.
    Warum übergibst Du aber dei Daten-Array komplett auf dem Stack?
    Hast du schon mal versucht, Das Array Daten als Pointer an die Funktion Berechnung() zu übergeben?

    Gruß WinCoder



  • Mmmhh könntest du das etwas näher ausführen? Mir persönlich war ja auch die erste Idee mit dem pDoc = GetDocument() übergeben lieber. Nur das habe ich ja nicht mal durch den Compiler bekommen.
    Gebraucht wird eigentlich nur der Zugriff über den Index und Kopieren ist nicht nur aufgrund der Größe der Daten tabu. Für alles dazwischen wäre ich offen. Allerdings verwirren mich die ganzen tutorials, Einführungen und Vorschläge im Netz mehr als daß sie bei mir zur Klarheit beitragen.

    CU
    Joe



  • Zuerst mal. Verwende Codetags.

    Wo erstellst du eine Instanz deiner Berechnungsklasse.
    Wenn du ein SDI hast dann sollte das in der DOC passieren und auch dort ein Zeiger darauf existrieren.



  • Unix-Tom schrieb:

    Zuerst mal. Verwende Codetags.

    Oh, sorry, aber die Buttons unter dem Eingabefenster funktionieren hier im Pool nicht.

    Unix-Tom schrieb:

    Wo erstellst du eine Instanz deiner Berechnungsklasse.
    Wenn du ein SDI hast dann sollte das in der DOC passieren und auch dort ein Zeiger darauf existrieren.

    Mhhh. Ich habe mich an dem bestehenden Programm orientiert und hab in AnwendungDoc.h zu den schon existierenden Einträgen in

    class CAnwendungDoc : public CDocument
    { ...
    public: CMeineKlasse MeineKlasse;
    ....}
    

    hinzugefügt. Und es ist ein MDI -- wenn das weiterhilft...

    CU
    Joe, der langsam merkt, daß er noch weniger Ahnung hat als er ohnehin schon dachte.



  • Hi,

    Deine eigene Klasse musst genau wissen wie das Array auf das du zugreifen möchtest aussieht. Dann kannst du auch einen Zeiger von der Doc- in die eigene Klasse übergeben.

    Ich habe das so gemacht:

    datentypen.h :

    #pragma once 
    #include "afxtempl.h"
    typedef CArray<int, int> CMyIntArray;
    

    wenn du den Header nun einfach in der Doc-Klasse und in deiner eigenen Klasse einbindest.

    xxxdoc.h:

    #include "datentypen.h"
    CMyIntArray m_Array;
    

    eigeneklasse.h

    #include "datentypen.h"
    CMyIntArray* m_pArray;
    

    dann kannst du innerhalb der Doc-Klasse mit m_Array[i] und in der eigenen Klasse mit (*m_pArray)[i] drauf zugreifen.

    hoffe das hilft dir bissel weiter 🙂

    edit:
    habe die zuweisung vergessen *g*
    xxxdoc.cpp:

    eigeneklasse.SetArray(&m_Array);
    

    eigeneklasse.cpp:

    void SetArray(CMyIntArray* pArray)
    {
       m_pArray = pArray;
    }
    


  • Tow-B.de schrieb:

    hoffe das hilft dir bissel weiter 🙂

    Mhhh ja danke. Geschichte wird gemacht, es geht (in Tippelschritten) voran...

    Allerdings wirft das gleich die nächste Frage auf:
    Wenn ich das ganze auf ein CArray mit

    struct DSatz {
       float element1;
       float element2;
    };
    typedef CArray <DSatz,DSatz> CMyArray;
    

    übertrage, und dann in MeineKlasse.cpp mittels

    float aa = (*m_pArray)[i].Element1; 
    // oder auch 
    float ab = (*m_pArray).GetAt(i).Element1;
    

    zugreifen will, dann kommt ein Laufzeitfehler (afxtempl.h line 298).

    Paar Experimente mit

    DSatz tmp = (*m_pArray).GetAt(i);
    float e1 = tmp.element1
    

    brachten zum Vorschein, daß nicht von "DSatz zu DSatz" konvertiert werden konnte. Das scheint auch der Laufzeitfehler zu sein, oder? Wenn dies Mysterium jetzt noch jemand auflösen könnte, wäre ich hoffentlich bald am Ziel. Gibt es da eine praktikable und kurze Lösung, da ich auf die Elemente 1001mal zugreifen müßte...?

    CU
    Joe



  • Joe Behr schrieb:

    Das scheint auch der Laufzeitfehler zu sein, oder? Wenn dies Mysterium jetzt noch jemand auflösen könnte, wäre ich hoffentlich bald am Ziel. Gibt es da eine praktikable und kurze Lösung, da ich auf die Elemente 1001mal zugreifen müßte...?

    Wirklich schade, daß mir da keiner mit einem Tipp weiterhelfen kann, denn leider funktioniert das Programm immer noch nicht so wie ich es will. Und ich weiß auch nicht weiter.
    Vielleicht kann man ja den alternativen Weg vom ersten Posting mit der Übergabe des AnwObject-Zeigers weiterverfolgen. Nur leider meckert auch da der Compiler, daß trotz Einbindens der Headerdatei AnwObject in MeineKlasse.cpp ein nichtdeklarierter Bezeichner sei.

    Es muß doch schon einmal vorgekommen sein, daß man aus der *View heraus eine Methode einer Klasse mit einer public-Variable einer anderen Klasse aufrufen muß - eben auch mit arrays und structs. Könnte mir da jemand Programmbeispiele mit OpenSource im Netz nennen - daß ich mir die relevanten Stellen selbst versuche abzuleiten?

    CU
    Joe


Anmelden zum Antworten