amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Aus einer Klasse auf Element einer anderen Klasse zugreifen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

29.06.2005, 19:53 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hallo,

Ich möchte folgendes erreichen:
Ich habe ein C++ Programm bei dem die GUI in einer Klasse beschrieben ist.
Ich habe noch eine weitere Klasse deren Memberfunktionen ich aus der GUI heraus aufrufe.
Jetzt möchte ich aber aus einer Memberfunktion dieser zweiten Klasse heraus ein GUI Element der ersten Klasse beeinflussen.
Was wäre denn für so einen Fall die korrekte Vorgehensweise ?

Im Netz habe ich folgendes gefunden:

newProgramFrame* instance = new newProgramFrame;

(newProgramFrame ist der Name der GUI Klasse)

Mit instance.NameDerMemberFunktion();
Sollte ich jetzt mein GUI Element beeinflussen können.
Leider bekomme ich beim kompilieren immer diese Fehlermeldung:

no matching function for call to 'newProgramFrame::newProgramFrame()'


[ - Antworten - Zitieren - Direktlink - ]

30.06.2005, 10:49 Uhr

_PAB_
Posts: 3016
Nutzer
Ich würde das so machen:
Du kannst beim Aufruf der Memberfunktion der zweiten Klasse (aus GUI heraus) einen Zeiger auf das GUI mitgeben:
code:
class GUI {
  Other B;
  void memebr() {
    B.name(this);
  }
  void irgendwas() { ; }
}

class Other {
  void name(GUI *gui) {
    gui->irgendwas ();
  }
}

this is dabei immer ein Zeiger auf die Klasse, in der man gerade ist.

[ Dieser Beitrag wurde von _PAB_ am 30.06.2005 um 10:49 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

30.06.2005, 12:45 Uhr

Reth
Posts: 1858
Nutzer
@Kaesebroetchen:

Hi,

folgende Möglichkeiten bieten sich auch an:

1. Beim Aufruf der Membermethode, welche das Element der GUI-Klasse beeinflusst eine Referenz auf die GUI-Klasse als Parameter mitgeben.

2. Beim Aufruf der Membermethofe, welche das Element der GUI-Klasse beeinflusst das Element oder eine Referenz darauf mit als Parameter übergeben.

Beide Vorgehensweisen haben aber Nachteile.
Bei der Ersten kannst Du auf alle public und evtl. auf noch mehr Elemente und Methoden Deiner GUI-Klasse zugreifen, egal ob das nötig ist, bei der 2. ist das Prinzip der Kapselung und des Informationhiding m.E. verletzt, da Du eine Element einer Klasse (bzw. eine Referenz darauf) übergibst.

Man sollte evtl. eine andere Konstruktion wählen, diese hängt aber von Deinen Anforderungen und Deinem Klassenmodell ab (welches dann vielleicht geändert/erweitert werden müsste), so dass es schwierig ist direkt was zu raten!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

30.06.2005, 13:20 Uhr

_PAB_
Posts: 3016
Nutzer
@Reth:
> Bei der Ersten kannst Du auf alle public [...] Elemente und Methoden Deiner GUI-Klasse zugreifen,

Naja, das ist ja auch die Absicht von "public".
Wenn man andere Dinge in der Klasse haben möchte, auf die man nicht zugreifen können soll, dann macht man die eben "private" oder "protected".
Ich würde daher die erst Möglichkeit vorschlagen, die ich ja auch schon weiter oben beschrieben habe.

[ - Antworten - Zitieren - Direktlink - ]

30.06.2005, 16:41 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@_PAB_:
@Reth

Also erst mal Danke für den Tip.
Ich habe jetzt nur folgendes Problem.
Wenn ich im Header, meiner "NICHT GUI KLASSE" den Header der "GUI KLASSE" include, dann kommt beim compilieren, der Fehler ("NICHT GUI KLASSE" is used as a type but not defined as a type). Da scheint sich irgenwas zu beissen.
Da die GUI Klasse von einer anderen Klasse veerbt wurde, habe ich diese als Typ für "GUI *gui" genommen. Das funktioniert zwar, aber ich habe keinen Zugriff auf die GUI Elemente die ich beeinflussen möchte.
Irgend eine Idee wie ich diesen include Konflikt lösen kann ?


[ - Antworten - Zitieren - Direktlink - ]

01.07.2005, 01:04 Uhr

_PAB_
Posts: 3016
Nutzer
@Kaesebroetchen:
Da mußt Du schon die Header-Dateien mal herzeigen.
Sieht mir irgendwie eher nach einem anderen Problem, als das eigentliche Includen der Header aus.

[ - Antworten - Zitieren - Direktlink - ]

01.07.2005, 08:06 Uhr

Reth
Posts: 1858
Nutzer
Zitat:
Original von _PAB_:
@Reth:
> Bei der Ersten kannst Du auf alle public [...] Elemente und Methoden Deiner GUI-Klasse zugreifen,

Naja, das ist ja auch die Absicht von "public".
Wenn man andere Dinge in der Klasse haben möchte, auf die man nicht zugreifen können soll, dann macht man die eben "private" oder "protected".


Schon klar. Aber ich will immer so wenig wie möglich rumreichen usw. :D

Zitat:
Ich würde daher die erst Möglichkeit vorschlagen, die ich ja auch schon weiter oben beschrieben habe.

Stimmt, sorry. Wollte aber doch die Referenz ins Spiel bringen anstelle Deines Zeigers.
Aber hier ist wohl doch die erste Methode am angesagtesten. Es sei denn man bastelt sich ein Parameterobjekt, welches immer übergeben wird, aber das hängt von dem Daten- und Klassenmodell ab, wie ich schon sagte. Evtl. bietet sich ja ne ganz andere Lösung an.

@Käsebrötchen
Wie sehn denn Deine Header aus? Verhinderst Du mehrfache includes?
Evtl. brauchst Du ne Forward-Deklaration, dazu müsste ich aber daheim in meinem Code mal graben, wird aber nix vor Sonntag Abend.

[ - Antworten - Zitieren - Direktlink - ]

01.07.2005, 13:13 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hier mal mein Quellcode

Das es ziemlich viel Code ist, hier ein paar Links:
Header der GUI Klasse
Quelle der GUI Klasse
Header der Anwendungsklasse
Quelle der Anwendungsklasse
Header meiner Klasse
Quelle meiner Klasse

Wie gesagt, ziemlich viel.

[ - Antworten - Zitieren - Direktlink - ]

01.07.2005, 20:03 Uhr

_PAB_
Posts: 3016
Nutzer
Das ist wirklich ein bißchen viel Code.
Leider kann ich das so nicht kompilieren.
Vielleicht versuchst Du mal ein Mini-Beispiel zu machen, das zu kompilieren und wenn Du siehst, daß es läuft, weißt Du, daß der Fehler nicht im Prinzip steckt, sondern irgendwo im Detail und dann kannst Du alles nochmal kurz prüfen.

[ - Antworten - Zitieren - Direktlink - ]

05.07.2005, 15:38 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@PAB
@Reth

Ich wollte mich nur noch mal für die Hilfe bedanken, es läuft jetzt !
Es war alles nur eine Frage der Reihenfolge.

Nachdem ich meine Klasse vor dem ifndef eingebunden hatte, lief alles.

#include "afr.h"

#ifndef __NEWPROGRAMFRAME_H__
#define __NEWPROGRAMFRAME_H__

//include "afr.h"

Wenn ich es dahinter einbinde gibt das dutzende Fehler.


[ Dieser Beitrag wurde von Kaesebroetchen am 05.07.2005 um 15:41 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Aus einer Klasse auf Element einer anderen Klasse zugreifen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.