Compiler Fehler!! Bitte helfen für mein Verständis!!
-
Hallo C++ Programmierer !
Ich habe ein Szenario das mir Sorgen bereitet!class Funktion
{
public:
void foo();
};void Funktion::foo()
{ ...
}class alt : public MUIWidget
{
public:
void bufferalt();private:
Funktion testxy;
};void alt::bufferalt()
{
}Beim Compilieren bekomme ich eine Fehlermeldung. Ich habe bis jetzt nur
in class alt: public MUIWidget unter private Funktion testxy deklariert.Compiler Fehler:
'Funktion' is used as a type, but is not defined as a typeKann mir jemand weiterhelfen?
Was muss ich ändern um in void alt::bufferalrt() die Routine foo() aufzurufen?
Eigentlich würde das mit testxy.foo(); doch gehen, oder ?Mfg Bernd T
-
Bernd T schrieb:
Ich habe bis jetzt nur
in class alt: public MUIWidget unter private Funktion testxy deklariert.Und jetzt auf Deutsch?
Bernd T schrieb:
Was muss ich ändern um in void alt::bufferalrt() die Routine foo() aufzurufen?
Eigentlich würde das mit testxy.foo(); doch gehen, oder ?Nicht viel. class MUIWidget definieren und Funktion::foo( ) in alt::bufferalt( ) als Methode von testxy aufrufen...
class MUIWidget { }; class Funktion { public: void foo() { }; }; class alt : public MUIWidget { private: Funktion testxy; public: void bufferalt() { testxy.foo( ); }; };
Wo liegt dein Problem?
greetz, Swordfish
Aja: Dein Compiler?
-
Hallo !
Genau so steht es in meinem Programm:class Funktion
{
public:
void SetRufII();
};void Funktion::SetRufII()
{...
}class alt : public MUIWidget
{
private:
Funktion testxy;public:
virtual void TestButton()
{ testxy.SetRufII();
};
}Fehlermedlung vom Compiler:
'Funktion' is used as a type, but is not defined as a type
`testxy' undeclared (first use this function)
Each undeclared identifier is reported only once for each function it appears in.)So, hast Du dafür jetzt auch noch eine Antwort ???
Gruss Bernd T.
-
Du hast doch nur namen geändert und ein virtual eingeschoben.
Zum Teufel nochmal: welcher Compiler!?greetz, Swordfish
-
Compiler: Dev-C++ 4.9.9.2
-
Wegwerfen!
Nimm mingw, gcc, msvc, sonstwas, aber keine Uralt-IDE die nie toll war und deren Entwicklung eingestellt wurde.
greetz, Swordfish
-
dev-cpp == mingw == gcc
Das ist doch alles die gcc, oder?@Bernd T.
Zeig doch mal den genauen Quellcode (und benutzt "[cpp]" tags),
ich hab das Gefühl du lässt wichtige Teile weg (den Teil mit dem Fehler).In welcher Zeile treten den die Fehler auf?
-
class alt : public MUIWidget
{
private:
Funktion testxy; <== Fehlerquellepublic:
virtual void TestButton()
{testxy.SetRufII(); };
}Falls ich den Aufruf testxy.SetRufII(); weg lasse und nur die "Funktion testxy"
deklariere. Da meckert der Compiler.Folgender Hinweis den ich hier noch nicht erwähnt habe, vielleicht gibt
dieses Aufschluss !Ich habe beide Funktion getrennt voneinander, damit meine ich das zwei
Headerdatein mit deren Quelltext zusammengefügt werden sollen.Headerdatei I [test.h]
class Funktion
{
public:
void foo();
};Im Quelltext von Headerdatei I steht die Funktion! [test.cpp]
void Funktion::foo()
{...
}***********************************************************************
Headerdatei II [lamp.h]
class alt : public MUIWidget
{
private:
Funktion testxy;public:
virtual void TestButton()
{ testxy.foo();
};
}Kann dies eine Ursache sein?
-
// Headerdatei: lamp.h #include "test.h" class alt : public MUIWidget { //... };
Der Kompiler muss schon wissen das es die Klasse Funktion gibt. Deshalb musst du die Headerdatei einbinden.
Gruß
Don06
-
Sorry, daran liegt es leider nicht...!
Danke für den Hinweis...
-
Kleiner Auszug aus dem Tutorial für's C++-Forum:
Poste den relevanten Originalcode; Auslassungspunkte und Anmerkungen als C++-Kommentare; das Ganze ordentlich eingerückt, in cpp-Tags eingehüllt.
-
Hallo !
Ich habe den Quellcode im Anhang beigelegt!Anhand der fett gedruckten Textzeilen erkannt man die relevanten Stellen, welche
die FehlermeldungCUIMbt.h:32: error: 'Funktion' is used as a type, but is not defined as
a typehervorrufen!
Ich hoffe es gibt Euch die Möglichkeit mir weiterzuhelfen!
Mfg Bernd T.
#ifndef CUIMBT_H
#define CUIMBT_H#include "MUIWidget.h"
#include "CDesktop.h"class CUIMbt : public MUIWidget
{
public:CUIMbt( const CUIRect &aRectangle, int aXPos , int aYPos );
virtual void Draw();
virtual void PXDraw(int aXPos, int aYPos);
virtual bool HandlePenEvent( MInputReader::TTouchEventData& aData );
virtual bool HandleKeyEvent( MInputReader::TKeyEventData& aData );CDesktop::TColor ActivColor;
CDesktop::TColor BackColor;
CDesktop::TColor DisabledColor;
CDesktop::TColor FontColor;CUIMbt();
CUIMbt( const CUIMbt& );
CUIMbt& operator=( const CUIMbt& );void Draw( CDesktop::TColor aFontColor, CDesktop::TColor aBackColor );
void Draw( CDesktop::TColor aBackColor);private:
Funktion testxy;protected:
bool iPressed;
private:int aX;
int aY;};
#endif
#include <stdio.h>
#include <unistd.h>#include "CUIMbt.h"
#include "MVirtualScreen.h"
#include "MFrameBuffer.h"CUIMbt::CUIMbt ( const CUIRect &aRectangle, int aXPos , int aYPos ) : MUIWidget( aRectangle, NULL, NULL )
{ PXDraw(aXPos, aYPos);
}void CUIMbt::PXDraw(int aXPos, int aYPos )
{ aX = aXPos;
aY = aYPos;testxy.SetRufII(); // Aufruf !!
}void CUIMbt::Draw(CDesktop::TColor aActivColor, CDesktop::TColor aBackColor)
{
CDesktop::Rect(iFrameBuffer,
iRectangle.iTopLeft.iX,
iRectangle.iTopLeft.iY,
iRectangle.iTopLeft.iX + iRectangle.iSize.iX,
iRectangle.iTopLeft.iY + iRectangle.iSize.iY,
aBackColor);CDesktop::PutPixel(iFrameBuffer, aX, aY, CDesktop::ColorWhite);
}void CUIMbt::Draw()
{ const CDesktop::TColor tmpFontColor = CDesktop::ColorWhite;Draw( ( iPressed ) ? BackColor :tmpFontColor,
( iPressed ) ? tmpFontColor: BackColor ) ;
}bool CUIMbt::HandlePenEvent( MInputReader::TTouchEventData& aData )
{
}bool CUIMbt::HandleKeyEvent( MInputReader::TKeyEventData& aData )
{
}#include <stdio.h>
#include <stdlib.h>#include "TTUIInit.h"
#include "TTUIBase.h"
#include "CUIScreen.h"
#include "CUILabel.h"
#include "UIListBoxes.h"
#include "CUIEventLoop.h"
#include "CUIButton.h"
#include "CUICheckBox.h"
#include "CUIInput.h"#include "CDesktop.h"
#include "CUIWidgetGroup.h"
#include "sdkconstants.h"#include "CUIMbt.h"
CUIScreen *screen = NULL;
CUIMbt *pxtest = NULL;class Funktion
{
public:
void SetRufII() {};
void ResetRufII() {};
};int TTUIInit(int argc, char** argv) {
screen = new CUIScreen( MColorScheme::KSchemeLocBrowser );
pxtest = new CUIMbt(CUIRect(300,20,100,50),45,60);
screen->AddWidget(pxtest);
CUIEventLoop::GetEventLoop().SetScreen(screen);
return 0;
}
-
wenn du jetzt noch sagst, was in welcher Datei ist ...
-
Ok ! Kein Problem...
Die erste Quellcode ist die CUIMbt.h,
der zweite Quellcode ist die CUIMbt.cpp
der dritte Quellcode ist die TTGui.cpp Datei.So hängt der Quellcode zusammen!
Ich hoffe, das hilft weiter ?
Mfg Bernd T.
-
Lern Syntaxhighlighting! Das sind diese tollen bunten Kästchen, in denen andere manchmal ihre Sourcen posten. Da kann man dann auch pro Datei ein Kästchen benutzen, und die Einrückung sieht man auch. Wurde Dir aber schon mehrmals nahegelegt.
-
Ich habe es versucht mit den tollen Kästchen, aber irgendwie habe ich es nicht hinbekommen. War wohl das falsche Kästchen!
Da habe ich es halt so gemacht, aber ich geben Dir recht !
Schöner ist es!
-
tja du hast deine class Funktion in der CPP Datei deklariert, nachdem Include von CUIMBT.H ... woher soll CUIMbt wissen, dass es die class Funktion gibt?
mach ne eigene HEader meinetwegen funktion.h, packe die Klassendeklaration dahinein und binde die Header in CUIMBT.H (und überall, wo du die class Funktion sonst noch brauchst) ein ...
Füge das nächste mal deinen Code in Cpp-Tags ein
[ cpp ] mein C++ Code [ /cpp ]
(lasse einfach die Leerzeichen innerhalb der eckigen Klammern weg, dann funktionierts wie gewünscht.
-
@ Checker&Murckser
Danke für die Antwort !
Du hattest recht, so funktioniert es!
Nur warum muss ich denn die Klass in einer Header Datei schreiben.
Funktional ist das auf jeden Fall gut und übersichtlich.
Rein formal hätte ich jetzt behauptet, CUIMbt kennt die Klasse Funktion.Mfg Bernd T.
-
Bernd T. schrieb:
...
Rein formal hätte ich jetzt behauptet, CUIMbt kennt die Klasse Funktion...Und woher ?
Es kommt übrigens (auch "formal") nicht darauf an, wen oder was eine Klasse kennt, sondern was der Compiler kennt ... und der kann nur kennen, was man ihm mitteilt... und die "Mitteilungsform für den Compiler" nennt man Sourcecode (von Compilerswitches mal abgesehen) ...Gruß,
Simon2.