CFtpConnection in andere Klasse übergeben
-
Hallo,
ich habe ein Projekt in dem ich mit den FTP-Funktionen spiele.
Nun habe ich ein arges Problem, ...offenbar mit den Grundlagen der OOP

In meiner Hauptdialogklasse habe ich zwei Membervariablen in der Klasse
angelegt:CInternetSession session; CFtpConnection* ftpConn;Nun stelle ich eine Verbindung in der Klasse zu meinem FTP-Server her:
ftpConn = session.GetFtpConnection("m_Servername","m_Loginname","m_passwort",21,FALSE);Ich lege eine weitere Klasse für einen IDD_PROPPAGE_DIALOG an (nennen wir die
Klasse einfach prop1).In meiner Hauptklasse kommt oben in der Dlg.cpp ein include für die prop1
mit rein.Nun erzeuge ich in der Klasse prop1 ein Objekt (auch als Membervariable der Klasse):
HautpdialogDlg zugriff;Bereits hier meckert der Compiler, dass er die Variable nicht kennt.
Ich mussHautpdialogDlg zugriff;zwingend unter die includes
in der prop1.cpp setzen, damit es klappt.Und nun greife ich auf ftpConn zu:
zugriff.ftpConn->PutFile(localfilename,remotefilename,FTP_TRANSFER_TYPE_ASCII,1);Ich kann kompilieren und das programm starten. Sobald ich aber bei PutFile oder
irgendwo ankomme, wo ich mitzugriff.arbeiten will, stürzt das
Programm gnadenlos ab.Leider komme ich momentan nicht an den Hauptrechner heran, weil meine Frau
daran arbeitet. Aber vielleicht seht ihr schon so, was ich da falsch mache.Ich vermute, dass ich es einfach mit diesen klassenübergreifenden OOP Sachen
noch nicht richtig verstanden habe. Da bitte ich um etwas nachsicht
-
Das was du machst funktioniert nicht. Mit der Anweisung
HautpdialogDlg zugriff;legst du ein völlig neues Dialogobjekt deiner Hauptdialogs an. Der bekommt nicht mit das irgendwelche Sockets offen sind, da er mit dem Hauptdialog nur die Klassendeklaration gemein hat. Damit existieren 2 Instanzen deiner Hauptdialogklasse, die eine mit offener Connection zum FTP-Server, die andere ohne. Abhilfe: du brauchst doch nur in deinem Prop-Dialog einen Zeiger auf den Haupdialog und greifst darüber auf die Member zu. Voraussetzung ist, diese Member sind nicht private deklariert.
Einfachste Möglichkeit: Du erweiterst die Prop-Klasse um eine Zeigervariable auf den Hauptdialog (Header einbinden nicht vergessen) und erweiterst weiterhin den Konstruktor deines Prop-Dialoges um einen Zeiger auf das Hauptdialogobjekt://Prop1.h #include CHauptdialog.h ... CDeinHauptdialog* pDeinDialog; //Prop1.cpp CProp1::CProp1(CDeinHauptdialog* pMainDlg) { pDeinDialog=pMainDlg; }Jetzt dürftest Du immer im Prop-Dialog drauf zugreifen können. Voraussetzung ist aber immer, dass die Hauptdialogklasse noch existent ist, was in deinem Fall immer gegeben sein dürfte.
-
Bereits hier:
CDeinHauptdialog* pDeinDialog;Bekomme ich die Meldung:
Syntaxfehler: Es fehlt ';' vor '*'
Meine prop2.h:
#pragma once #include "stdafx.h" #include "afxwin.h" #include "FTPBoundDlg.h" #include "afxinet.h" #include "afxext.h" // prop2-Dialogfeld class prop2 : public CDialog { DECLARE_DYNAMIC(prop2) public: prop2(CWnd* pParent = NULL); // Standardkonstruktor virtual ~prop2(); // Dialogfelddaten enum { IDD = IDD_PROPPAGE_MEDIUM1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() public: CListBox m_box; afx_msg void OnLbnDblclkList1(); virtual BOOL OnInitDialog(); afx_msg void OnBnClickedButton1(); int m_Flag; static UINT thrFunction(LPVOID pParam); void downloaden(void); CFTPBoundDlg *ptrx; //<----------Dort kommt der Fehler! };Gehe ich mit der Maus über CFTPBoundDlg zeigt er mir das aber als bekannte Klasse an. Mich irritiert allerdings die Info über dem *ptrx, denn dort erhalte ich
CFTPBoundDlg prop2::*ptrxZudem erhalte ich in der Zeile auch noch:
'prop2::CFTPBoundDlg': Fehlende Speicherklasse oder Typspezifizierer
-
Du hast höchstwahrscheinlich einen Kreuz-Inkludierung (cross include), d.h. die Header rufen sich gegenseitig auf.
Du benötigst in dem Dialog-Header aber nur eine sog. Vorwärtsreferenz (forward reference):class CFTPBoundDlg; // statt #include "FTPBoundDlg.h"In der entsprechenden Dialog-Source-Datei (FTPBoundDlg.cpp) mußt dann dann jedoch #include "FTPBoundDlg.h" einfügen, damit die entsprechenden Methoden bekannt sind.
-
Hi TH69,
du meinst in meiner FTPBoundDlh.h schreibe ich
class CFTPBoundDlg;und in der FTPBoundDlg.cpp dann
#include "FTPBoundDlg.h"?
In meiner anderen Klasse prop2.h/.cpp habe ich dann alleridngs noch immer
das gleiche Problem. Ich muss dort ja wieder Bezug auf FTPBoundDlg nehmen
und einen Zeiger oderso angeben, mit dem ich auf die Funktionen/Variablen
der Klasse FTPBoundDlg zugreife. Wie stelle ich das denn richtig an?