Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem bei Modularisierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.08.2006, 10:05 Uhr
Yadgar



High!

Ich versuche gerade, die Deklaration und Definition einer Klasse, die in mehreren Übungsprogrammen gebraucht wird, in separate Module auszulagern, nach dem Schema:

klasse.h:


C++:
#include <iostream>
using namespace std;

#ifndef KLASSE_H
#define KLASSE_H

class Klasse;

#endif



klasse.cpp:

(Definition der Klasse mit sämtlichen Methoden)

programm.cpp:

C++:
#include "klasse.h"

main- und globale Funktionen



So weit, so gut... der Compiler meckert ständig, dass die in einer der globalen Funktionen definierte Instanz von Klasse "has incomplete type and cannot be defined"!

Habe ich bei der Aufteilung des Codes auf die drei Module irgendetwas nicht beachtet?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 08.08.2006 um 11:33 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.08.2006, 10:24 Uhr
Oliver
S2-Pixelgeneral


Im Programm muss die Klassendefinition bekannt sein, also muss deine klasse.h so aussehen:


C++:
class X
{
int x,y,z;

void foo();
};



Die Deklaration kannst du nur nehmen, wenn die Klassendefinition uninteressant ist, z.B. wenn du nur Pointer auf die Klasse speicherst und keine Methode von ihr aufrufst.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 08.08.2006 um 10:25 Uhr von Oliver editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.08.2006, 10:31 Uhr
Yadgar



High!


Zitat von Oliver:
Im Programm muss die Klassendefinition bekannt sein, also muss deine klasse.h so aussehen:


C++:
class X
{
int x,y,z;

void foo();
};






Wenn ich die Definition aus klasse.cpp nach klasse.h (oder besser single_inst.h und single_inst.cpp, die Klasse heißt in Wirklichkeit "SingleInstance") verlagere, kommt bei der ersten Zeile von klasse.cpp (wo die beiden statischen Variablen der Klasse definiert und initialisiert sind) die Fehlermeldung `SingleInstance' has not been declared... ein Tippfehler kann es nicht sein, denn die Klasse hat vorher, ohne Modularisierung, einwandfrei funktioniert!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 08.08.2006 um 10:31 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.08.2006, 10:34 Uhr
(un)wissender
Niveauwart


Du machst nicht die Defintion in h sondern die Deklaration. Allerdings reicht eine Forwarddeklaration nicht. Mach es so wie von Oliver vorgeschlagen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.08.2006, 10:43 Uhr
Yadgar



High!


Zitat von (un)wissender:
Du machst nicht die Defintion in h sondern die Deklaration. Allerdings reicht eine Forwarddeklaration nicht. Mach es so wie von Oliver vorgeschlagen.


Dann muss also das "Grundgerüst" der Klasse mit Variablen und Funktionsprototypen sowohl in single_inst.h als auch in single_inst.cpp stehen? So funktioniert es zumindest...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.08.2006, 11:04 Uhr
Karldin Shinowa
Professional Noob


Das Grundgerüst ohne Definitionen gehört in den Header und die Definitionen mit hilfe ClassName:: in die cpp

C++:
//CField.h
#ifndef CFIELD_H
#define CFIELD_H

class CField
{
   private:
      bool isEmpty;
  
   public:
      bool getIsEmpty();
      void set(bool b);

      CField()
  
};
#endif

//CField.cpp
#include"CField.h"

CField::CField()
{
   isEmpty=true;
}

bool CField::getIsEmpty()
{
   return isEmpty;
}

void CField::set(bool b)
{
   isEmpty=b;
}

//main.cpp
#include<iostream>
using namespace std;
#include"CField.h"/*Nur der innere Aufbau da main nicht mehr braucht zum complimieren und    die definitionen bekommt beim linken*/

int main()
{
   CField f1;
   f1.set(true);
   if(f1.getIsEmpty()==true) cout<<"Voll";
}


--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 08.08.2006 um 11:04 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.08.2006, 15:44 Uhr
Yadgar



High!


Zitat von Karldin Shinowa:
Das Grundgerüst ohne Definitionen gehört in den Header und die Definitionen mit hilfe ClassName:: in die cpp

C++:
//CField.h
#ifndef CFIELD_H
#define CFIELD_H
...

//CField.cpp
#include"CField.h"





Ja, mit dem Inkludieren von CField.h auch in CField.cpp funktioniert es! Danke!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: