zugriff auf ein klasse



  • afro82 schrieb:

    die zweite klasse soll auf daten von der ersten klasse zugreifen!

    Deine erste Klasse hat keine Daten. Sie hat nur Instanzvariablen (nicht statische Variablen). Wenn du auf die Daten einer Instanz deiner ersten Klasse zugreifen willst, musst du die Instanz der zweiten Klasse mit einem Zeiger oder einer Referenz auf die Instanz der ersten Klasse versorgen.



  • Schade, dass der Betreff bei sowas immer etwas anders ist... dieses Problem wurde bestimmt schon 100mal geklärt. 🙄

    Ruft der View den Dialog mit DoModal auf? Dann musst du da ansetzen.
    Was willst du denn dann machen?



  • ich kann es so machen...

    klass A hat include satz # include "kalssA.H"

    der include satz in kalss B einfügen.
    then ein variable der kalss a deklarieren.
    also

    CklassA klassaVariable;

    then ruf irgend eine funktion in der klasse A auf

    klassaVariable.einefunktion();

    aber du darfst nicht beide aufrufen sondern eine ruft die andere nur.

    wenn du möchtest dass beide klassen nutzen von einandern den funktionen.

    dann ich mache so.
    ich erstelle ein dritte klasse die verwaltet beide.



  • erstmal danke für eure hilfe

    ich habe folgendes gemacht habe eine funktion in Klasse 1 die ich in klasse zwei aufrufen will

    die funktion soll zu einen bestimmten punkt in meiner datenbank gehen das geht auch wenn ich das in der CFinalV1View aufrufe!!!
    die funktion!!!

    void CFinalV1View::OnSuchen(int m_a)
    {
    switch(m_a)
    {
    case 1:
      {
      m_pSet->MoveFirst();	// springt zu ersten Punkt in der Datenbank
       while(m_sen!= m_pSet->m_Sensor 
    	{
    	  m_pSet->MoveNext();	//geht zum nächsten datensatz
    	}
    	break;
    	}
    case 2:
    	{
    	m_pSet->MoveFirst();	// springt zu ersten Punkt in der Datenbank
    	while(m_bew!= m_pSet->m_Befehl)	
    	{
    	  m_pSet->MoveNext(); //geht zum nächsten datensatz
    	}
    	break;	
    	}
      }
    }
    

    nun möchte ich die suchen funktion unter der anderen klasse nutzen.

    void Sensor::OnSchreiben() 
    {
    
    UpdateData(true);
    CFinalV1View hallo;
    hallo.m_bew=m_bew;
    hallo.OnSuchen(2);
    UpdateData(false);
    }
    

    dabei kommte folgender feher:
    **
    error C2248: "CFinalV1View::CFinalV1View" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "CFinalV1View" erfolgte**

    ich habe dann die CFinalV1View von protected auf public gesetzt

    class CFinalV1View : public CRecordView
    {
    protected: // Nur aus Serialisierung erzeugen
       // CFinalV1View(); habe ich hier entfernt 
        DECLARE_DYNCREATE(CFinalV1View)
    
    public:
        //{{AFX_DATA(CFinalV1View)
        CFinalV1View(); // habe ich eingefügt
        enum { IDD = IDD_FINALV1_FORM };
        CListBox    m_liste;
        CFinalV1Set* m_pSet;
        CString    m_bew;
        CString    m_sen;
        int m_counter;
    

    dann habe ich aber folgenden fehler so bald ich die funktion Onschreiber unetr der 2.Klasse aufrufe stürtzt bein programm ab

    im Debugmodus sagt er mir folgende fehler meldung!!!
    Nicht abgefangene Ausnahme in finalV1.exe (MFCD42D.DLL): 0xC0000005: Access Violation.
    den fehler mit der (MFCD42D.DLL) habe ich weg bekommen dadurch das ich statische biliotheken benutze aber der rest ist noch da

    und jetzt weiß ich wirklich nicht mehr weiter ich hoffe ihr könnt mir helfen



  • In

    void Sensor::OnSchreiben()

    wird eine ganz neue Instanz von CFinalV1View erstellt. Damit wird dann

    void CFinalV1View::OnSuchen(int m_a)

    aufgerufen. Könnte es evtl. möglich sein, dass m_pSet dann ebenfalls ganz neu ist und somit keinen gültigen Wert besitzt ?



  • ich werde so machen.

    hallo.m_bew=m_bew; // übergeben m_bew variable direkt an funktion

    hallo.OnSuchen(2 , m_bew);

    dann mußt du die OnSuchen function ändern daß sie 2 parameter annehmen kann

    der fehler Access Violation kommt ammeisten wenn was stimmt nicht mit der nafang oder ende der tablen oder was stimmt nicht mit den bearbeiteten Werte . ich denke an m_bew.



  • das könnte sein ich weiß es nicht wie kann ich das überprüfen?



  • ich werde so machen.

    hallo.m_bew=m_bew; // übergeben m_bew variable direkt an funktion

    hallo.OnSuchen(2 , m_bew);

    dann mußt du die OnSuchen function ändern daß sie 2 parameter annehmen kann

    der fehler Access Violation kommt ammeisten wenn was stimmt nicht mit der nafang oder ende der tablen oder was stimmt nicht mit den bearbeiteten Werte . ich denke an m_bew.



  • danke erstmal

    ich habe das geendert aber der fehler ist immer noch da !!!



  • schau mal ob du sätze in der tabelen hast. es darf die table nicht leer sein.



  • ja in der datenbank was drin und wenn ich die funktion unter der view klasse aufrufe geht das auch



  • die view klasse ist mit recordset verbunden dann benutzen wir
    m_pSet->MoveFirst();

    wenn du in andern klasse bist, die nicht mit crecordset ist.
    dann benutze

    andereklasse::MoveFirst();
    und nicht m_pSet->MoveFirst();

    es funktioniert immer bei mir



  • ich bekomme nicht die auswahl das ich MoveFirst() als funktion einfügen kann
    liegt vielleicht daran das die basis klasse von meinen 2.Klasse nicht vom type CRecordView ist sonder von Typ Dialog

    ich brauche aber den Type Dialog weil sonnst kann ich nicht DoModal() ausführen um mein dialog fester zu öffnen.

    kannst du mir vielleicht ein Beispiel geben?



  • mach ein neues projekt , das mit einer table in DB verbindet. ...SDI...

    im klassen ansicht eine neue klasse MFC klasse erstellen die mit zweite tbl verbunden ist.....dynaset ist wichtig
    eine funktion einfügen.

    void neueklasse::tuewas()
    {
      neueklasse::MoverFirst();
      while(!neueklasse::isEOF());
      {
       if(m_Name == "dokdok")
       {
        neueklasse::Delete();
        break;
       }
       else
       {
        neueklasse::MoveNext();
       }
      }
    }
    
    //in der viewklasse
    # include "neueklasse.h"
    
    void viewklasse::deletedokdok()
    {
      Cneueklasse neueklasseVariable;
      neueklasseVariable.tuewas();
    }
    


  • danke
    ich werde das gleich mal probieren

    wenn ich das anderes herum machen will also aus der neuenklasse auf die view müsste ja auch gehen oder ?



  • glaube ich nicht. ich denke in einer richtung nur.
    habe einmal versucht ....fehlgeschlagen.

    die best lösung.
    viewklasse ist unabhängig von der DB und füge extra 2 klassen für die 2 tbl und verwalte der prozess durch die viewklasse.

    viewklasse
    | |
    tbl_1_klasse tbl_2_klasse

    wenn du den verkeher hin und her zwischen die beiden tbl klassen möchtest dann durch viewklasse mit # include "headerklasse1.h"
    # include "headerklasse2.h"

    wenn in einer richtung dann wie ich vorher gemacht



  • danke

    ich glaube ich bin zu doof dafür das mit den zwei klassen raffe ich noch nicht
    ein beispiel wäer wieder schon nur wennes keine umstände macht


Anmelden zum Antworten