Ergebnis 1 bis 7 von 7

Thema: [C++] Klassen untereinander referenzieren.

  1. #1
    Shogun Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard [C++] Klassen untereinander referenzieren.

    Als ich heute an diesem wunderschönen Morgen (grau und Regen) aufstand und mich an eine kleines Projekt machen wollte, merkte ich, dass ich wiedereinmal den Wald vor Lauter Bäumen nicht sehe ...

    Ich versuche aus Gründen der Einfachheit mehrere Klassen untereinander zu verlinken.
    Dazu habe ich eine Klasse (cKernel) die auf alle Klassen referenziert und auf die alle Klassen referenzieren.
    Das funktioniert auch wunderbar, nur kann ich leider, sofern ich der Kernelklasse eine der andere übergeben habe, nicht darauf zugreifen ...

    Es folgen die Codes der Datei (alles unwichtige weggelassen),
    Folgendes bezieht sich nur auf die Referenzierunf von Kernel und MainFrame, da der Fehler bei allen anderen Klassen derselbe ist.

    main.cpp
    Code:
    	#include "kernel/kernel.h"
    	#include "mainFrame/mainFrame.h"
    
    	bool cApp::OnInit()
    	{
    		// create the kernel
    		cKernel *Kernel = new cKernel();
    
    		// create default frame
    		cMainFrame *MainFrame = new cMainFrame(_T(LangFourWinsServer), wxPoint(0, 0), wxSize(WindowSizeX, WindowSizeY));
    		MainFrame->Show(TRUE);
    		Kernel->RegisterMainFrame(MainFrame);
    
    		// set the default window
    		SetTopWindow(MainFrame);
    
    		return true;
    	}
    kernel.h
    Code:
    	#ifndef _FILE_KERNEL_H
    		#define _FILE_KERNEL_H
    
    		class cMainFrame;
    
    		class cKernel
    		{
    			public:
    				cMainFrame			*MainFrame;
    
    				void RegisterMainFrame(cMainFrame *MainFrame);
    		};
    
    #endif // _FILE_KERNEL_H
    kernel.cpp
    Code:
    	#include "kernel/kernel.h"
    
    	void cKernel::RegisterMainFrame(cMainFrame *MainFrame)
    	{
    		// register to the kernel
    		this->MainFrame = MainFrame;
    
    		MainFrame->OnFullScreen();
    	}
    mainFrame.h
    Code:
    	#ifndef _FILE_MAIN_FRAME_H_
    		#define _FILE_MAIN_FRAME_H_
    
    
    		class cKernel;
    
    		class cMainFrame : public wxFrame
    		{
    			public:
    				cKernel *Kernel;
    
    		};
    
    	#endif // _FILE_MAIN_FRAME_H_
    Das ganze funktioniert auch relativ gut.
    Allerdings bekomme ich bei dem Befehl MainFrame->OnFullScreen(); (Bei this->MainFrame->OnFullScreen(); passiert dasselbe.) folgende Ausgabe.

    kernel.cpp||In member function »void cKernel::RegisterMainFrame(cMainFrame*)« : |
    kernel.cpp|72|Fehler: invalid use of undefined type »struct cMainFrame«|
    kernel/kernel.h|34|Fehler: forward declaration of »struct cMainFrame«|
    ||=== Build finished: 2 errors, 0 warnings ===|
    Wenn ich den obengenannten Befehl weglasse, wird es anstandslos kompiliert.

    OS: Ubuntu Linux 64 Bit
    IDE: Code::Blocks
    FW: wxWidgets
    GCC: 4.1.2-16ubuntu2 (gutys)
    CPP: 4.1.2-16ubuntu2 (gutsy)

    Hat jemand eine Idee, wie man das Problem lösen kann ??
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Du nutzt in der Header Datei Vorwärtsdeklaration um dort keine Includes nutzen zu müssen. Schöne Sache (mach ich auch so), aber ich glaube du hast vergessen in der kernel.cpp die mainFrame.h zu includen.

    Jetzt weiß der Compiler zwar das es cMainFrame gibt, und kann die Zeigeroperationen ausführen (die Zuweisung) da alle Zeigeradressen 32 bzw. 64 Bit groß sind, aber der Methodenaufruf geht schief -> er weiß ja nicht welche Methoden für cMainFrame überhaupt existieren.

  3. #3
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Hey, du hattest recht.
    Funktioniert wunderbar, aber wird jetzt nicht zusätzlich Overhead erzeugt ??
    Oder kann ich davon ausgehen, das dem nicht so ist ?
    Ansonsten schonmal vielen Dank.

  4. #4
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    In welcher Hinsicht ein Overhead?
    Du musst die Headerdatei includen, sonst weiß der Compiler ja nicht was das für eine Struktur/Klasse ist (also welche Funktionen, Methoden und Member). Du kannst sonst nicht damit arbeiten.

  5. #5
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Ja ist mir klar, aber so werden sie ja teilweise doppelt includiert.
    Der Compiler erstellt ja aus jeder .cpp Datei eine .o Datei und linkt das dann.
    Demnach müsste ja, wenn ich die Datei mainFrame.h in 2 verschiedenen .cpp Datein includiere der Code ja in beiden .o Datein mit drin sein.

    Wenn nun der Linker die .os verlinkt, schmeisst er dann die doppelten Informationen raus?

  6. #6
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Halt, du verwechselst hier gerade Definition und Deklaration. In der Header Datei stehen (normalerweise) nur die Definitionen deiner Klassen und deren Methoden/Membervariablen. Dort steht kein ausführbarer Code (Deklaration).
    Der Compiler braucht die Definition für jede Objektdatei (.o) um zu wissen, was er mit einer Instanz machen kann. Die Definition der Klasse steht am Ende nicht in der Objektdatei.

    Natürlich hast du beispielsweise bei Templates, bei der die Deklaration in der Headerdatei drin stehen muss um während der Compilezeit den Code erstellen zu können, Redundanzen. Weiß jetzt aber nicht ob die eventuell wegoptimiert werden. Das müsste dann im Linker geschehen.

    Und Vorwärtsdeklaration von Klassen in Headerdateien beschleunigen einfach den Compiliervorgang, weil der Compiler nicht für jede Objektdatei 100te Header parsen muss.

  7. #7
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Ok, vielen Dank für die Hilfe und für die Infos.

Ähnliche Themen

  1. bilder in tabelle direkt untereinander
    Von Dominikgt im Forum HTML & CSS Forum
    Antworten: 27
    Letzter Beitrag: 12.04.2007, 14:59
  2. Div-Container _direkt_ untereinander platzieren (HTML, CSS)
    Von HolyMarcell im Forum HTML & CSS Forum
    Antworten: 4
    Letzter Beitrag: 26.02.2007, 21:50
  3. Datensätze untereinander prüfen
    Von meierhans im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 1
    Letzter Beitrag: 04.11.2006, 17:27
  4. Grafiken nebeneinander und untereinander anbringen
    Von grafik_problem im Forum HTML & CSS Forum
    Antworten: 6
    Letzter Beitrag: 04.10.2005, 18:34
  5. Untereinander referezierbare Windows
    Von eva im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 1
    Letzter Beitrag: 03.12.2004, 15:44

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •