Anfängerprobleme mit OOP

DaFunk2k

Mitglied
Hallo alle zusammen,

ich muss für ein Projekt einen Datenlogger in embedded VC++ programmieren. Nun bin ich kein Experte in C++ und habe noch nicht wirklich viel in C++ gemacht. Habe einen Fehler, den ich mir nicht erklären kann. Vielleicht kann mir ja jemand von euch weiterhelfen:

Hauptdatei: test.cpp
#include "CFile.h"
#include "stdafx.h"

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CFile test;
return 0;
}

Header-Datei: CFile.h
#ifndef _CFile_h_
#define _CFile_h_

#include "StdAfx.h"

class CFile
{
public:

HANDLE h;
CFile(void);
~CFile(void);
BOOL CFile::_SetCommState( HANDLE , LPTSTR );
HANDLE CFile::OpenAndConfigurePort( int , TCHAR *modeString );
void CFile::ClosePort( HANDLE );
}

#endif _CFile_h_

und das sind die Fehler die er mir sagt:

C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\Test.cpp(6) : error C2628: 'CFile' followed by 'int' is illegal (did you forget a ';'?)
C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\Test.cpp(10) : error C2556: 'class CFile __cdecl WinMain(struct HINSTANCE__ *,struct HINSTANCE__ *,unsigned short *,int)' : overloaded function differs only by return type from '
int __cdecl WinMain(struct HINSTANCE__ *,struct HINSTANCE__ *,unsigned short *,int)'
C:\Windows CE Tools\WCE300\EDAS_CE10\Include\winbase.h(372) : see declaration of 'WinMain'
C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\Test.cpp(10) : error C2371: 'WinMain' : redefinition; different basic types
C:\Windows CE Tools\WCE300\EDAS_CE10\Include\winbase.h(372) : see declaration of 'WinMain'
CFile.cpp
C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\CFile.cpp(9) : error C2011: 'CFile' : 'class' type redefinition
C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\CFile.cpp(263) : fatal error C1004: unexpected end of file found
Generating Code...
Error executing cl.exe.

Schon aus dem ersten Fehler werde ich nicht schlau.
 
Hi,

Includier mal die stdafx nur in den cpp Dateien und nicht in den Headern.
In den cpp Dateien dann aber als aller aller erste Quellcodezeile.

In der Header Datei lass mal das CFile:: weg.
Abgesehen davon, gibts die CFile nicht schon? Nutz die für Dateizugriffe...

Vielleicht sollteste die noch umbennen.

Gruß Michael
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort.
Habe in der zwischenzeit den Großen Fehler bemerkt.

Nach der Klassen Anweisung muss ein ; stehen...also nach der schließenden Klammer. :(

Gibt es die Klasse Bruch eigentlich auch schon? Hatte zum Testen einfach eine ganz einfache Klasse für Brüche erstellt und da sagt er "Bruch' : 'class' type redefinition"
 
Hi.
DaFunk2k hat gesagt.:
C:\Programme\Microsoft eMbedded Tools\Common\EVC\MyProjects\Test2\Test\Test.cpp(6) : error C2628: 'CFile' followed by 'int' is illegal (did you forget a ';'?)
Schon aus dem ersten Fehler werde ich nicht schlau.
Wer lesen kann... (sorry, das konnt ich mir jetzt nicht verkneifen.)

DaFunk2k hat gesagt.:
Gibt es die Klasse Bruch eigentlich auch schon? Hatte zum Testen einfach eine ganz einfache Klasse für Brüche erstellt und da sagt er "Bruch' : 'class' type redefinition"
Nein, eine Klasse Bruch gibt es standardmäßig nicht, die würde dann auch eher Fraction heißen.

Gruß
 
Habe das fehlende ; nur immer in der Hauptdatei gesucht und bin erst gar nicht auf die Idee gekommen, dass er die Klassendatei meint.

Aber aus dieser angeblichen Class redefinition werde ich immer noch nicht schlau. Ich poste jetzt mal den kompletten Quellcode eines kleinen Testprogrammes. Auch wenn es ein wenig viel Code wieder ist, aber vielleicht hat ja jemand noch eine Idee wo der Fehler liegen könnte.

bruch.cpp
#include "bruch.h"

class Bruch
{
public:
double zaehler;
double nenner;

Bruch()
{
this->zaehler=1;
this->zaehler=1;
}
Bruch(double zaehler, double nenner)
{
this->zaehler = zaehler;
this->nenner = nenner;
}
~Bruch()
{
// Desktruktor
}

};

bruch.h
#ifndef bruch_h
#define bruch_h bruch_h

class Bruch
{
public:
double zaehler;
double nenner;


Bruch();
Bruch(double , double );
~Bruch();

};

#endif

und dann das Hauptprogramm bruchtest.cpp
#include "stdafx.h"
#include "bruch.h"

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
Bruch test;

return 0;
}

an der Stdafx.h Datei habe ich nichts verändert:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

// Windows Header Files:
#include <windows.h>

// Local Header Files

// TODO: reference additional headers your program requires here

//{{AFX_INSERT_LOCATION}}
// Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)


Die precompiled Header habe ich übrigens abgeschaltet, weil es sonst bei mir irgendwie überhaupt nicht laufen wollte ;-)


Hoffentlich findet jemand den Fehler :-)
 
Hi.

Der Fehler ist, das du die Klasse Bruch 2-mal definierst - einmal im Header und dann nochmal in der Quelldatei.

Was du machen möchtest ist die Methoden der Klasse zu definieren und das geht dann (außerhalb der Klassendeklaration) so:
C++:
#include "bruch.h"

Bruch::Bruch(double z, double n) : zaehler(z), nenner(n) { };

Bruch::~Bruch() {};

Du könntest übrigens statt des Standardkonstruktors auch folgendes machen:
C++:
class Bruch {
  ...
public:
  Bruch (double z = 1., double n = 1.);
  ...
};
Es ist grundsätzlich besser die Initialisierungsliste der Konstruktoren zu verwenden anstatt im Konstruktor Werte zuzuweisen - dazu ist sie schließlich da.

Gruß
 
Zurück