Mehrere Klassen, Zugriff außerhalb Klasse?



  • Hallo Leute,
    ich habe mehrere Klassen und wollte außerhalb der Klasse auf Methoden der anderen Klasse zugreifen.
    In der Headerdatei der Klasse Automat ist ein Zeigerobjekt vom Typ der Klasse Display deklariert worden.
    Nun habe ich dieses Zeigerobjekt in der Klasse Automat instanziert und versucht auf die Methode der Klasse 2 zuzugreifen.
    Da es ein Zeiger ist habe ich schon this oder auch -> benutzt. Bekomme jedoch immer wieder Fehlermeldungen.

    Würde mich freuen, wenn ihr mir helfen könntet.

    Hauptklasse Automat.cpp

    #include "Automat.h"
    #include "Display.h"
    #include <iostream>
    
    using namespace std;
    
    int main() {
    	dis = new Display;
    	dis.anzeigen();
    
    };
    
    Hauptklasse Automat.h
    
    #include "Automat.h"
    #include "Display.h"
    using namespace std;
    
    class Display;
    class Automat;
    
    class Automat
    {
    	privat: 
    	int var;     
    	Display* dis;	   
    };
    
    2. Klasse
    ------------------------------------------------------------------------------
    Display.cpp
    
    #include "Display.h"
    #include "Automat.h"
    #include <iostream>
    using namespace std;
    
    void Display::anzeigen() {
    	cout<<"Es wird angezeigt"<<endl;
    }
    
    Display.h
    
    #include "Automat.h"
    
    using namespace std;
    class Automat;
    class Display;
    
    class Display
    {
    	public: void anzeigen();
    };```cpp
    
    


  • @MethodMan2025 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    Bekomme jedoch immer wieder Fehlermeldungen

    Copy&Paste

    Das was du da unter "Hauptklasse Automat.cpp" hat mit einer Klasse nichtes zu tun.



  • Wenn Du willst, daß man Dir KOSTENLOS hilft, solltest Du Dir schon mehr Mühe bei der Formulierung Deiner Frage geben.



  • Das solltest du beim Verfassen deines Beitrags gesehen haben:

    Willkommen

    Nimm Dir bitte Zeit Deinen Beitrag richtig zu formulieren und zu formatieren. Wir verwenden in diesem Forum Markdown für die Formatierung der Beiträge. Achte bitte insbesondere auf die folgenden Punkte beim Verfassen Deines Beitrages:

    • Formatiere Deinen Code! Verwende dazu den Code-Knopf:
    • Halte Deinen Code kurz und verständlich
    • Erkläre, was Du bereits probiert hast
    • Stelle mindestens eine klare und konkrete Frage

    Weiterführende Informationen wie man Fragen richtig stellt, findest Du hier.



  • Aufgrund der vielen #includes, die irgendwie wirr durcheinander gewürfelt wirken (oder bist du nach dem Motto "viel hilft viel" vorgegangen?), haben deine Header viel störenden unnötigen Krempel. Zum Beispiel hat using namespace std; schon gar nichts in Header-Dateien verloren. Und warum includet das Display.h dein Automat.h? Dafür fehlen include-Guards.

    Vielleicht reduzierst du dein Problem als erstes mal auf eine einzige Datei (das ist dann für uns auch schneller zu copy-pasten), sodass du zumindest erstmal den ganzen Aufteilungsboilerplate los bist.

    Das hier sieht eher nach Java oder C# aus, aber nicht nach C++:

    dis = new Display;
    dis.anzeigen();
    

    Warum nicht:

    Display dis;
    dis.anzeigen();
    

    Das hat auch kein Speicherleck (merke: new möglichst gar nicht benutzen, weil es schnell zu Speicherlecks führt).



  • Sorry als Anfänger ist es schwer sein Problem zu schildern, ich versuch es nochmal:

    @wob ich habe ein Beispielcode in C++, wo es so gelöst wurde, daher habe ich es auch so versucht.

    @manni66 ich hoffe es ist jetzt besser.

    Ich habe mit VisualParadigm ein UML Diagramm erstellt.
    Dort habe habe ich mehrere Klassen, die eine Kompositionsbeziehung haben.
    Im Programm kann man aus dem Diagramm einen C++ Code erstellen lassen.
    Dies habe ich auch gemacht. Im Code wird die Kompositionsverbindung als Zeiger-Objekt umgesetzt.

    Nun habe ich einfach mal versucht, aus der Systemklasse (Automat) aus, auf die public Methode der Klasse Display mit dem Zeiger-Objekt vom Typ Display, welches in der Klasse Automat erstellt wurde zuzugreifen bzw. die Methode anzeigen( ) aufzurufen.
    Leider gelingt mir es nicht, es kommen verschiedene Fehlermeldungen, wie undefiniert usw.



  • Wo hast Du von Compiler welche Fehlermeldungen erhalten? Sollen wir in die Glaskugel schauen, um
    Dir zu helfen?



  • @MethodMan2025 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    Ich habe mit VisualParadigm ein UML Diagramm erstellt.
    Dort habe habe ich mehrere Klassen, die eine Kompositionsbeziehung haben.
    Im Programm kann man aus dem Diagramm einen C++ Code erstellen lassen.
    Dies habe ich auch gemacht. Im Code wird die Kompositionsverbindung als Zeiger-Objekt umgesetzt.

    Nun habe ich einfach mal versucht, aus der Systemklasse (Automat) aus, auf die public Methode der Klasse Display mit dem Zeiger-Objekt vom Typ Display, welches in der Klasse Automat erstellt wurde zuzugreifen bzw. die Methode anzeigen( ) aufzurufen.

    Ich würde diese automatisch generierten Klassen nicht verwenden. Das Diagramm schon, aber dann die dortigen Kassen erst mal selbst schreiben, bis man versteht wie sie funktionieren.



  • @zeropage danke für dein Vorschlag, werde es auch so machen.

    @mgaeckler Habe den Code bereinigt und neu erstellen lassen, da mittlerweile durch das ständige Versuchen unzählige Fehler angezeigt wurden.
    Jetzt wird nur noch: Der Bezeichner "dis" ist nicht definiert. "dis": nichtdeklarierter Bezeichner angezeigt.

    Ich wollte einfach mal kucken, wie Komposition, Aggregation, Assoziation im Code umgesetzt werden und wie man von der Systemklasse aus, auf die Methoden der anderen Klassen zugreifen kann.
    Dafür werden z.T. Objekte bzw. Zeiger-Objekte in der Systemklasse erstellt, mit welcher man Zugriff auf die public Methoden der anderen Klassen hat.



  • Dein in "Automat.cpp" geschriebener Code hat bisher nichts mit der in "Automat.h" deklarierten Klasse "Automat" zu tun (außerdem ist diese Klasse bisher ziemlich sinnlos, da alle Member als private deklariert sind, d.h. von außen gar kein Zugriff darauf stattfinden kann -> du solltest mindestens einen Konstruktor sowie Getter-Methoden definieren).

    Die main-Funktion solltest du in eine eigene Datei auslagern (meist benutzt man dafür dann "<projektname>.cpp" oder eben "main.cpp").

    Nach welchem Buch lernst du denn C++?



  • @Th69 ich arbeite zurzeit mit keinem Buch.
    Es wäre super, wenn ich ein paar fertige UML Projekte finden könnte, wo das UML Klassendiagramm und der dazugehörige Code gezeigt wird.
    Wie gesagt, mich interessiert eigentlich nur der Zusammenhang, wie bestimmte Klassendiagramme konkret im Code umgesetzt werden.

    Wäre sehr dankbar, wenn jemand mir eine Quelle nennen könnte.





  • @Wade1234 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    eigentlich beschäftigt man sich mit sowas, bevor man mit c++ anfängt.

    Warum? Ich hab' keinen Tau von UML.



  • @Swordfish sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    @Wade1234 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    eigentlich beschäftigt man sich mit sowas, bevor man mit c++ anfängt.

    Warum? Ich hab' keinen Tau von UML.

    nein du hälst ja auch nichts davon, kästchen zu malen. aber eigentlich geht es in dem buch auch um objektorientierte modellierung. und zumindest vorhin kostete es nur 6,80€, das ist weniger als eine schachtel zigaretten, oder einmal zu mc doof.



  • @Wade1234 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    nein du hälst ja auch nichts davon, kästchen zu malen.

    Ähm doch.



  • @Wade1234 sagte in Mehrere Klassen, Zugriff außerhalb Klasse?:

    probiers mal damit: https://www.amazon.de/UML-Modeling-Objektorientierte-Modellierung-Programmers/dp/3827314070/ref=sr_1_8?__mk_de_DE=ÅMÅŽÕÑ&crid=3RHPQKDN4BNW5&keywords=objektorientierte+modellierung&qid=1580675925&sprefix=objektorientierte+mo%2Caps%2C188&sr=8-8

    eigentlich beschäftigt man sich mit sowas, bevor man mit c++ anfängt.

    Also man kann schon UML machen bevor man C++ macht. Aber IMO sollte man schon eine objektorientierte Programmierpsrache kennen bevor man UML macht. Weil das sonst halt ist wie wenn man nem Blinden versucht was über Farben zu erzählen.


Anmelden zum Antworten