Methode aus einer anderen Klasse abrufen
-
Hallo,
ich habe in einer Klasse ein Methode definiert,
class CTest : public CWnd ..... public: Void CTest::Funktion()...aber, wie kann ich diese Methode in meiner View-Klasse abrufen?
Danke
-
Hmm kommt darauf an, in wie weit die Klasse View einen Pointer auf das Objekt odg. hat ...
-
Ne, die Klasse "MeinView" hat keinen Pointer auf das Objekt... wie mache ich das?
Die Methode wollte ich nicht direkt in der Klasse "MeinView" schreiben, da der Code ein bißchen lang ist.
Dann habe ich ein neue Klasse erstellt, wo ich die Methode reingeschrieben habe.
Die beiden Klassen kennen sich nur per der Header-Datei
-
class CViewklasse{ CTest *p; CViewklasse(){ p= new CTest(); } ~CViewklasse(){ delete p; } MethodeAusCTestAuruefne(){ p->Funktion(); } ..... };
-
Erweitere den Konstruktor Deines Dialoges um einen Pointer oder eine Referenz auf das Objekt:
MyDialog dlg(obj); dlg.DoModal();oder schreibe dafür einen Setter in Deine Dialogklasse:
MyDialog dlg; dlg->SetObj(obj); dlg.DoModal();
-
Danke erstmal für euere Antworten.
@ Jencas: es handelt sich um eine SDI-Anwedung (FormView) und nicht um ein Dialog
@ BorisDieKlinge: Beim Kompilieren wird keinen Fehler angezeigt, aber das Programm stürtzt genau an der Stelle ab, wo ich den Befehl mit der angesprochenen Methode ausführe.
Liegt das vielleicht an der Basisklasse der neuen Klasse?Gruß, Anny
-
Mit was für einer Meldung stürzt das Programm denn ab?
Anny schrieb:
Hallo,
ich habe in einer Klasse ein Methode definiert,
class CTest : public CWnd{...};Da deine Klasse von CWnd abgeleitet ist, hast du vermutlich in der Funktion auf das (nicht vorhandene) Fenster zugegriffen - die meisten CWnd-Methoden funktionieren erst, wenn das Objekt (per Create() oder Attach()) mit einem Fanster-Handle gekoppelt wurde.
(btw, ist das überhaupt nötig? sprich: Was für eine Aufgabe hat deine CTest-Klasse?)
-
Die Fehlermeldung schaut so aus:
Unbehandelte Ausnahme bei 0x7824ad5c (mfc80d.dll) in MeinProgramm.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000020.In der Aufrufliste steht in der ersten Zeile folgende Meldung
>mfc80d.dll!CWnd::GetDlgItemTextA(int nID=1001, ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > > & rString="") Zeile 1124 + 0x3 Bytes C++und verweist mit einem gelben Pfeil auf (ASSERT(::IsWindow(m_hWnd)); ) :
int CWnd::GetDlgItemText(int nID, CString& rString) const { ASSERT(::IsWindow(m_hWnd)); rString = _T(""); // empty without deallocatingin wincore.cpp
In der Methode aus der Klasse CTest ist ein Befehl über die serielle Schnittstelle definiert.
Ohne Methode funktioniert der Befehl in MeinView ohne Probleme, aber wegen der Übersichtlichkeit möchte ich halt den Befehl über die angesprochne Methode der Klasse CTest ausführen.
-
Genau was ich vermutet habe - dein CWnd (bzw. CTest)-Objekt benötigt ein eigenes Fenster(-Handle), auf das die Methoden der CWnd-Klasse zugreifen wollen. Da du dieses Fenster nirgends angelegt hast, läuft dieser Aufruf in's Leere.
Aber wie es aussieht, willst du nichtmal ein eigenes Fenster verwenden, sondern auf das Fenster des FormView zugreifen. Dazu benötigst du keine Ableitung von CWnd, sondern ein Member, der auf das "eigene" View verweist:
class CViewKlasse; class CTest { CViewKlasse* m_parent; public: CTest(CViewKlasse* parent) : m_parent(parent) {} void Funktion(); }; class CViewKlasse : public CFormView { CTest* m_test; public: CViewKlasse() : CFormView(ID_VIEW) { m_test = new CTest(this); } ~CViewKlasse() { delete m_test; } OnButton1() { m_test->Funktion(); } }; void CTest::Funktion() { CString input; m_parent->GetDlgItemText(IDC_ADRESS,input); ... }
-
Hallo CStoll,
ich habe Dein Code folgende Maßen eingefügt:
class CViewKlasse; // wo gehört das hin ? //------------------------------------------------------------------------------ // CTest.h class CTest { CViewKlasse* m_parent; public: CTest(CViewKlasse* parent) : m_parent(parent) {}; void Funktion(); }; //------------------------------------------------------------------------------ // CTest.cpp void CTest::Funktion() { CString input; m_parent->GetDlgItemText(IDC_ADRESS,input); ... } //------------------------------------------------------------------------------ // CViewKlasse.h class CViewKlasse : public CFormView { ... public: CTest* m_test; ... }; //----------------------------------------------------------------------------- // CViewKlasse.cpp CViewKlasse::CViewKlasse() : CFormView(CViewKlasse::IDD) { m_test = new CTest(this); } CViewKlasse::~CViewKlasse() { delete m_test; } . . OnButton1() { m_test->Funktion(); }Fehlermeldung beokomme ich in der Zeile 28 (CTest* m_test;) :
error C2143: Syntaxfehler: Es fehlt ';' vor '*' error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.in der ViewKlasse.h
public: enum { IDD = IDD_FORMVIEW };bekomme ich folgenden Fehler:
error C2065: 'IDD_FORMVIEW': nichtdeklarierter BezeichnerAusserdem bekomme ich lauter fehlern, die auf die MessageBoxA beziehen:
error C2660: 'MessageBoxA': Funktion akzeptiert keine 3 Argumenteoder zum Beispiel:
'SetDlgItemTextA': Funktion akzeptiert keine 2 Argumente
-
Anny schrieb:
Hallo CStoll,
ich habe Dein Code folgende Maßen eingefügt:
class CViewKlasse; // wo gehört das hin ?Das gehört an den Anfang der "CTest.h" Datei (sagt dir "Forward Deklaration" etwas?)
Fehlermeldung beokomme ich in der Zeile 28 (CTest* m_test;) :
error C2143: Syntaxfehler: Es fehlt ';' vor '*' error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.Da brauchst du entweder eine Forward-Deklaration oder ein #include "CTest.h", damit der Compiler die Klasse wiedererkennen kann.
in der ViewKlasse.h
public: enum { IDD = IDD_FORMVIEW };bekomme ich folgenden Fehler:
error C2065: 'IDD_FORMVIEW': nichtdeklarierter BezeichnerJa, wo ist er denn? Die ID deines Dialogs sollte schon mit dem übereinstimmen, was du im Ressourcen-Editor festgelegt hast.
Ausserdem bekomme ich lauter fehlern, die auf die MessageBoxA beziehen:
error C2660: 'MessageBoxA': Funktion akzeptiert keine 3 Argumenteoder zum Beispiel:
'SetDlgItemTextA': Funktion akzeptiert keine 2 ArgumenteJa, wenn du die globalen Funktionen aufrufen willst, erwarten die jeweils einen zusätzlichen Parameter (das Fenster-Handle, auf das sie angewendet werden sollen). Du mußt vor alle diese Aufrufe ein
m_parent->schreiben, um den Bezug zu deinem View-Fenster herzustellen.
-
Danke CSoll für Deinen Geduld.
"CTest.h" wurde schon in der ViewKlasse inkludiert, aber der Fehler taucht immer auf.
Jetzt habe ich die CTest-Klasse direkt in der ViewKlasse.h einfügt und sieh da, der Fehler ist weg.alle anderen Fehler mit der MessageBox sind auch weg.
Es bleibt nur noch den Fehler mit der ID des Views.
In der Resource-Datei ist alle korrekt definiert:#define IDD_FORMVIEW 103Bis jetzt (ohne der neuen Klasse) hatte ich keine Probleme mit der ID des Views gehabt.
-
Dann hast du vermutlich vergessen, die "resource.h" in dein Programm einzubinden (afaik sollte MSVC das eingetragen haben
).
-
Die resource.h wurde eigentlich schon im Programm eingebunden, nämlich in der ProgrammName.h
Ich habe jetzt die resource.h auch in der ViewKlasse.h eingebunden und es läuft ...
komisch, dass die resource.h zweimal eingebunden werden soll.Vielen vielen Dank, Du hast mich sehr geholfen und habe dazu was wichtiges gelernt

Viele Grüsse, Anny
-
Anny schrieb:
Die resource.h wurde eigentlich schon im Programm eingebunden, nämlich in der ProgrammName.h
Ich habe jetzt die resource.h auch in der ViewKlasse.h eingebunden und es läuft ...Und bindet die "ViewKlasse.h" auch die "ProgrammName.h" ein? (ich weiß, die gegenseitigen #include-Beziehungen können manchmal haarig sein ;))