Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 25.05.2004, 19:59 Titel: Modulaufteilung |
|
|
Argh, ich kriegs schon wieder nicht hin! Also im prinzip ist da die Editorklasse, die unter anderem ne Inputklasse hat. Diese Inputklasse soll auf die methoden der Editorklasse zugreifen, also übergeb ich einen Zeiger an sie:
Code: |
void CEditor::Init(CDirect3D* pDirect3D, CDirectInput* pDirectInput)
{
m_pDirect3D=pDirect3D;
m_pDirectInput=pDirectInput;
m_Modell.Init(m_pDirect3D);
m_Inputmanager.Init(m_pDirectInput, &m_Modell, this);
} |
Das Problem ist nun das inkludieren der Header:
Da sich Input.h und Editor.h gegenseitig einbinden, funzt das irgendwie nicht. Und wenn ich einfach die Vorwärtsdeklaration nehme:
Code: |
//Input.h
//Verwaltet mithilfe der DIKlasse die eingaben des Users
#pragma once
#include "Global.h"
#include "CDirectInput.h"
#include "Partlist.h"
//#include "Editor.h"
class CEditor;
class CInput
{
public:
CInput();
~CInput();
void Init(CDirectInput* pDirectInput, CPartlist* pPartlist, CEditor* pEditor);//Zeiger auf die Objekte speichern
void GetInput();//Die eingaben verarbeiten, jede Frame aufrufen
protected:
CDirectInput* m_pDirectInput;
CPartlist* m_pPartlist;
CEditor* m_pEditor;
}; |
Kommt dieser nette Fehler:
D:\C++\Modelleditor\Input.cpp(3 : error C2027: Verwendung des undefinierten Typs "CEditor"
d:\c++\modelleditor\input.h(10) : Siehe Deklaration von 'CEditor'
(und noch ein paar mehr)
Gibt es da ne Lösung, oder muss ich das ganze irgendwie anders aufbauen? Falls es nicht reicht kann ich auch mal die komplette Headerdatein posten, aber ich wollts nicht so lang machen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 25.05.2004, 20:19 Titel: |
|
|
wieso geht das denn net?
wenn du mit #include "Editor.h" deinem File die Deklaration von CEditor bekanntmachst, dann sollte das doch kein problem sein...
dazu brauchst du auch net die zeile class CEditor. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.05.2004, 12:06 Titel: |
|
|
Doch, denn wenn ich das mache, bindet Input.h Editor.h ein und Editor.h bindet Input.h ein.
Code: |
//Editor.h
#pragma once
#include "Global.h"
#include "CDirect3D.h"
#include "CDirectInput.h"
#include "Partlist.h"
#include "Input.h"
class CEditor
{
public:
CEditor();
~CEditor();
void Init(CDirect3D* pDirect3D, CDirectInput* pDirectInput);
void Render();
void Move();
//Zugriffsmethoden auf Elemente
void Zoom(float fVar);
void Raster(float fVar);
protected:
CDirect3D* m_pDirect3D;
CDirectInput* m_pDirectInput;
CPartlist m_Modell;
CInput m_Inputmanager;
Vector2 m_KameraPos;
eAchsen m_Achsen;
Vector3 m_CursorPos;//Position des Cursors im 3dimensinalen Raum
void UpdateCursorPos();//Berechne die Position des Cursors in der 3DWelt
void DrawRaster(HDC hDC);
float m_Raster;//Gibt an, wie fein man zeichenn kann. In absoluten werten (1.0f bedeute man kann nur 2.0f, 3.0f 4.0f usw. machen)
float m_Zoom;//Gibt an wie groß eine Einheit in ixel ist(10.0f bedeute das jede Einheit 10 Pixel von der nächsten entfernt liegt
};
|
So wies da oben steht, müsste es ja gehen, aber es kommt der Fehler:
:\c++\modelleditor\editor.h(2 : error C2079: 'm_Inputmanager' verwendet undefiniertes class 'CInput'
Und soweit gehts nur weil ich in der Global.h eine Vorwärtsdeklaration von CInput hab. Wenn ich die weglasse, kommt der Fehler: Fehlende Speicherklasse oder Typenbezeichner.
Das ist eben das komische, weil die Input.h doch eingebunden wird. Aber weil diese wiederum erstmal Editor.h einbindet, bevor die Klasse deklariert wird, gehts wohl nicht.
Und wenn ich halt nur die Vorwärtsdeklaration nehme, kommt ein Fehler wenn ich eine Methode des zeigers aufrufen will, wie ich oben schon geschrieben hab. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.05.2004, 13:45 Titel: |
|
|
Ich weiß net sicher, obs funzt, aber versuche es doch mal damit:
Code: | #ifndef _HEADERNAME_
#define _HEADERNAME_
//CODE
#endif |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.05.2004, 14:09 Titel: |
|
|
Naja, ich habs jetzt anders gemacht, nämlich einfach Zeiger auf die Elemente von CEditor übergbene, um sie zu bearbeiten, statt die Methoden von CEditro zu bentuzen. Jetzt gehts, es ist aber natürlich nicht so schön. Vieleciht probierich das mit dem ifdefine statt pragma once auch noch aus. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.06.2004, 15:42 Titel: |
|
|
Ich hab leider schon wieder ein solches Problem und wollt nicht extra ein neuen Thread aufmacheN.
Ich versuche gerade die im Buch mit
#define SCR_WIDTH 1024
#define SCR_HEIGHT 768
fest definierte Bildschirmgröße variabel zu machen. Da ja eine Funktionen diese Größe wissen müssen um z. B. einen Text zu zentreiren, hab ich einfach Globale int-Variablen draus gemacht.
Allerdigns bekomme ich jetzt in jeder Datei, in die ich die Global.h einbinde den Fehler:
main.obj : error LNK2005: "int SCR_HEIGHT" (?SCR_HEIGHT@@3HA) bereits in Ball.obj definiert
main.obj : error LNK2005: "int SCR_WIDTH" (?SCR_WIDTH@@3HA) bereits in Ball.obj definiert
Und wenn ich die Deklarationen nicht in die Global.h schreib sonder z. B. in die Datei wo auch die WinMainfunktion ist, gibts Compielrfehler, das er die nicht kennt.
am Anfang der Global.h steht schon #pragma once und ich hab auch schon
Code: |
#ifndef SCR
#define SCR
int SCR_WIDTH;
int SCR_HEIGHT;
#endif |
ausprobiert, ohne erfolg.
Bei globalen FUnktionen musste ich auch die eigentliche Funktion in Global.cpp schreiben und den Prototypen in die Globalh.
wieß jemand warum das nicht funktioniet? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 13.06.2004, 17:19 Titel: |
|
|
Zum ersten Problem:
Du musst in die Input.cpp die Editor.h inkludieren. Schließlich wird in der Input.cpp die variable vom Typ Editor verwendet. Diese hast du aber vorher nur durch class Editor bekannt gemacht.
Beim letzten Problem musst du afaik das schlüsselwort extern verwenden.
Wie man das genau verwendet weiß ich nicht mehr, benutze ich nie
Du musst glaube ich in einer datei "int bla;" schreiben und in den anderen .cpp's, die diese variable verwenden "extern int bla;" |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.06.2004, 17:36 Titel: |
|
|
jo, danke prima, hat mir sehr geholfen. Die Lösung ist ähnlich wie bei den globalen Funktionen:
in der Global.h:
extern int SCR_WIDTH
ind der Global.cpp
int SCR WiDTH _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
andijota Junior JLI'ler

Anmeldedatum: 07.11.2002 Beiträge: 66 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 17.06.2004, 15:24 Titel: |
|
|
nebenbei:
extern int externe_irgendwas;
kann ich ueberall und mehrmals schreiben .
andi |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.06.2004, 20:14 Titel: |
|
|
andijota hat Folgendes geschrieben: | nebenbei:
extern int externe_irgendwas;
kann ich ueberall und mehrmals schreiben .
andi |
Das ist ja der Sinn der Sache
"extern" definiert, dass die Variable/Konstante/o.ä. extern verfügbar ist, aber nicht deren Wert bzw. Inhalt. Deshalb ist es auch egal, wie oft du dem Kompiler zeigen willst, dass er die Variable extern verfügbar machen soll. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
|