Probleme mit getter-Methode
-
Hallo liebe leute,
es wäre nett, wenn ich von euch einen tipp wegen meines problemes bekommen könnte. bin jetzt über ostern mit c++ angefangen und häng nun absolut durch.
es geht um das getten einer membervariablen aus einer anderen klasse.
hab auch bereits hier nach "klasse zugriff" "klasse zeiger" gesucht, viel gefunden, viel probiert, aber es will nicht. weil ich mich nach bestimmt 6 stunden testläufen nicht noch weiter frusten lassen will, erlaubt mir mein problem kurz darzustellen.
ich sitze über einem visual c++ buch und möchte das thema splitterwindow durcharbeiten. die beiden vert. geteilten fenster enthalten jeweils ein form abgeleitet von cformview.
alles wird angezeigt, alles prima. im form1 deklariere ich ein cstring member "m_server_name" welches ich per konstructor initialisiere: = _T("Startwert"). in der initialupdate-methode von form1 wird diese member verändert: = _T("Neuer Wert").
form1 enthält eine getter-methode, die ich nutzte, um in form2 auf "m_server_name" zuzugreifen - so will es das lehrbuch. funzt auch.
aber ich erhalte immer nur den wert, den ich als erstes per konstructor gesetzt habe. die änderung dieses wertes wird ignoriert.
dann in meinen 10kg literatur rumgewühlt, folgendes probiert:- anderer konstruktor fehler: kein geeigneter standardkonstruktor verfügbar
- kopier-konstructor fehler: dto.
- diverse updatedata-kombinationen, leider auch nix.
will nur sagen, an beschäftigung hat es mir nicht gemangelt. bin ratlos.
hier sind die beiden files in sehr reduzierter, aber lauffähiger form:
form1 h + cpp
class CStatForm1 : public CFormView { DECLARE_DYNCREATE(CStatForm1) public: CStatForm1(); CString m_server_name; virtual ~CStatForm1(); CString GetServer(); virtual void OnInitialUpdate(); afx_msg void OnBnClickedButton1(); enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() }; inline CString CStatForm1::GetServer() { return m_server_name; } ===cpp=== #include "stdafx.h" #include "MySplitt.h" #include "StatForm1.h" IMPLEMENT_DYNCREATE(CStatForm1, CFormView) CStatForm1::CStatForm1() : CFormView(CStatForm1::IDD) , m_server_name(_T("Startwert")) //dieser Wert liefert der getter zurück { } CStatForm1::~CStatForm1() { } void CStatForm1::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CStatForm1, CFormView) ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) END_MESSAGE_MAP() void CStatForm1::OnInitialUpdate() { CFormView::OnInitialUpdate(); m_server_name = _T("Neuer Wert"); //der soll es gerne sein } void CStatForm1::OnBnClickedButton1() { AfxMessageBox(m_server_name); }
form2 h + cpp ============= class CStatForm2 : public CFormView { DECLARE_DYNCREATE(CStatForm2) public: CStatForm2(); virtual ~CStatForm2(); enum { IDD = IDD_DIALOG2 }; virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() afx_msg void OnBnClickedButton1(); }; ===cpp=== #include "stdafx.h" #include "MySplitt.h" #include "StatForm2.h" #include "StatForm1.h" IMPLEMENT_DYNCREATE(CStatForm2, CFormView) CStatForm2::CStatForm2() : CFormView(CStatForm2::IDD) { } CStatForm2::~CStatForm2() { } void CStatForm2::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CStatForm2, CFormView) ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) END_MESSAGE_MAP() void CStatForm2::OnBnClickedButton1() { CString x; CStatForm1 form1; x = form1.GetServer(); SetDlgItemText(IDC_EDIT1, x); UpdateData(FALSE); }
bevor meine freundin mich rausschmeisst, weil ich von der kiste hier nicht mehr wegkomme, helft mir bitte.
wäre schön, wenn ich verstehen würde, warum das so nicht funzen will.
also ein paar aufklärende worte wären nett.
hab mir alle mühe gegeben, das hier zu erklären, besser kann ichs noch nicht - sorry. das alles public ist, ist reine frustration, das guter c++ so nicht aussieht, hab ich bereits gelernt.vielen, vielen dank schon mal vorab.
gruss
-
OnInitialUpdate wird einmal aufgerufen, bevor die View angezeigt wird.
Du erstellst in der 2. Form eine neue 1. Form, bei der OnInitialUpdate nicht aufgerufen wird:void CStatForm2::OnBnClickedButton1() { CString x; CStatForm1 form1; x = form1.GetServer(); SetDlgItemText(IDC_EDIT1, x); UpdateData(FALSE); }
Übergib der 2. Form lieber einen Zeiger auf die 1. Form (per Setter oder Konstruktor). Dann sollte die Methode etwa so aussehen:
void CStatForm2::OnBnClickedButton1() { CString x; x = m_pForm1->GetServer(); SetDlgItemText(IDC_EDIT1, x); }
UpdateData brauchst Du wohl hier auch nicht...
-
danke für den beitrag.
hat sich aber schon erledigt
-
........................... Sorry, war ja der Antworten-Knopf...