Forum: PC-Programmierung c++ Programmierung "Basisklasse undefiniert trotz include "


von simo (Gast)


Lesenswert?

Hallo alle zusammen,



ich hänge seit heute morgen an eine dumme Fehler.
Es wird mir eine Fehlermeldung, die besagt, dass die Klasse nicht 
definiert ist obwohl es schon includet ist.

hat jemenden ein Idee vielleicht was ist die Ursache???

Danke

von D. I. (Gast)


Lesenswert?

Meine Kugel Kristall sagen 42

von Mark B. (markbrandis)


Lesenswert?

Sourcecode zeigen, Fehlermeldung zeigen, ansonsten sinnlos.

Copy & paste ist sooooo schwer! ;-)

von Hans-Georg L. (h-g-l)


Lesenswert?

Vielleicht ; am Ende der Klassendeklaration vergessen ?

Habe auch schon Compiler erlebt, die da unbedingt noch ein CR wollen ...

von LCDmann (Gast)


Lesenswert?

welchen Kompiler verwendest du?

von Udo S. (urschmitt)


Lesenswert?

Oder einfach verschrieben :-)

von simo (Gast)


Lesenswert?

Hallo und sorry für die unvollstndige Beschreibung des Problems:

anbei einen Abschnitt der Quellencode:


-->KlasseA
#include "KlasseB.h"
class KlasseA {

....
//Implementiereung der Schnitte Stelle
void KlasseB::getmProvider()
{
  //Hier kommen verschiedene Pobleme:

 KlasseA* obj = new obj();
  KlasseC* m_pro = obj->getProv();

}
}

-->KlasseB
class KlasseB
{
public:....
KlasseC* getProv(){ return m_pro;// und genau an diesen Instanz 
zugreifen möchte }

Meldungsfehler:
error C2065: 'KlasseA': nichtdeklarierter Bezeichner
error C2065:'obj': nichtdeklarierter Bezeichner
error C2061: Syntaxfehler: Bezeichner 'KlasseA'
error C2065: 'obj': nichtdeklarierter Bezeichner
error C2227: Links von "->getProv" muss sich ein Zeiger auf 
Klassen-/Struktur-/Union-/generischen Typ befinden.


ich hoffe es ist einige massen klar wo es das Problem

Danke in voraus

von eugen (Gast)


Lesenswert?

Falsche "Programmiersprache"?

von simo (Gast)


Lesenswert?

das Projekt ist in Visual Studio2010 c++ implementiert

von miller lite (Gast)


Lesenswert?

simo schrieb:
> das Projekt ist in Visual Studio2010 c++ implementiert
Dann ist 42 falsch, hier lautet die richtige Antwort 23.

von NurEinGast (Gast)


Lesenswert?

Vielleicht ; am Ende der Klassendeklaration vergessen ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

simo schrieb:
> anbei einen Abschnitt der Quellencode:
>
>
> -->KlasseA
> #include "KlasseB.h"
> class KlasseA {
>
> ....
> //Implementiereung der Schnitte Stelle
> void KlasseB::getmProvider()
> {
>   //Hier kommen verschiedene Pobleme:
>
>  KlasseA* obj = new obj();
>   KlasseC* m_pro = obj->getProv();
>
> }
> }

Hier deklarierst Du in KlasseA eine Memberfunktion von KlasseB.

Was soll das?

von Udo S. (urschmitt)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Hier deklarierst Du in KlasseA eine Memberfunktion von KlasseB.
Jepp,
und darin schreibt er:
...
KlasseC* m_pro = obj->getProv();
...
wohlgemerkt in der Definition von Klasse A

und in der Definition von Klasse B:
...
KlasseC* getProv(){ return m_pro;// und genau an diesen Instanz
...

Da beisst dich die Katze vollends in den Schwanz.
In A initialisiert er m_pro durch Aufruf der Funktion getProv()
und in B wird die Funktion getProv() definiert in dem auf eine Variable 
m_pro zugegriffen wird.

Das ist völlig konfus!
Entweder fehlt hier noch eine Kilotonne Code für das Verständnis, oder 
der TO sollte sich zuerst mal mit C# oder klassischem C beschäftigen und 
danach gaaanz viel über objektorientiertes Programmieren LESEN!

von simo (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> simo schrieb:
>> anbei einen Abschnitt der Quellencode:
>>
>>
>> -->KlasseA
>> #include "KlasseB.h"
>> class KlasseA {
>>
>> ....
>> //Implementiereung der Schnitte Stelle
>> void KlasseB::getmProvider()
>> {
>>   //Hier kommen verschiedene Pobleme:
>>
>>  KlasseA* obj = new obj();
>>   KlasseC* m_pro = obj->getProv();
>>
>> }
>> }
>
> Hier deklarierst Du in KlasseA eine Memberfunktion von KlasseB.
>
> Was soll das?

Hier:
>> //Implementiereung der Schnitte Stelle
>> void KlasseB::getmProvider()
>> {
>>   //Hier kommen verschiedene Pobleme:
>>
>>  KlasseA* obj = new obj();
>>   KlasseC* m_pro = obj->getProv();
>>
>> }
>> }

Ich versuche durch die Memberfunktion "getmProvider()"
den Instanz "m_pro" damit ich auf ihm zugreifen kann, da ich ihm brauche 
für eine andere Implementierung.
Kurz zu "m_pro":
er ist als Laufer in der Datenbanken. Für das schreiben verantwortlich 
und deswegen habe ich in den gleichen Datenbanken ein Ändereung gemacht 
um die Wiederholung in der Datenbanken zu vermeiden und deswegen brauche 
ich "m_pro"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Schön und gut, aber Memberfunktionen gehören zu einer Klasse und werden 
in der Deklaration dieser Klasse deklariert.

Du aber willst eine Memberfunktion einer völlig anderen Klasse in einer 
Klasse deklarieren bzw. sogar implementieren.


Da haut Dir der Compiler vollkommen zu Recht auf die Pfoten.

von simo (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> aber Memberfunktionen gehören zu einer Klasse und werden
> in der Deklaration dieser Klasse deklariert.
Das ist nicht ganz richtig:
Menberfunktion "getProv()" gehört zu KlasseA
und die andere "getmProvider()" gehört zu KlasseB

>
> Du aber willst eine Memberfunktion einer völlig anderen Klasse in einer
> Klasse deklarieren bzw. sogar implementieren

Nein : diese Implementierung:

void KlasseB::getmProvider()
>> {
>>   //Hier kommen verschiedene Pobleme:
>>
>>  KlasseA* obj = new obj();
>>   KlasseC* m_pro = obj->getProv();
>>
>> }
>> }

ermöglicht mir nur der Zugriff auf "m_pro"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dein Quellcodefragment sagt was anderes:
1
-->KlasseA
2
#include "KlasseB.h"
3
class KlasseA {
4
5
....
6
//Implementiereung der Schnitte Stelle
7
void KlasseB::getmProvider()
8
{
9
  //Hier kommen verschiedene Pobleme:
10
11
 KlasseA* obj = new obj();
12
  KlasseC* m_pro = obj->getProv();
13
14
}
15
}
Das ist immer noch in der Deklaration von KlasseA.

von Udo S. (urschmitt)


Lesenswert?

simo schrieb:
> Das ist nicht ganz richtig:
> Menberfunktion "getProv()" gehört zu KlasseA
> und die andere "getmProvider()" gehört zu KlasseB

Und warum definiert du dann getProv() in Klasse B und getmProvider() in 
Klasse A????
Sorry aber das ist mir zu konfus. Du solltest wirklich nochmal ganz von 
vorne anfangen und erst mal ein Buch über C++ und ein 2. über 
Klassendesign lesen.
Tschüß

von simo (Gast)


Lesenswert?

und wie soll ich den ambesten umgehen???

von Udo S. (urschmitt)


Lesenswert?

simo schrieb:
> und wie soll ich den ambesten umgehen???
Was willst du umgehen? Das Lesen eines C++ Buchs?

von bluppdidupp (Gast)


Lesenswert?

1
void KlasseB::getmProvider()
2
{
3
  //Hier kommen verschiedene Pobleme:
4
5
 KlasseA* obj = new obj();
6
  KlasseC* m_pro = obj->getProv();
7
8
}
raus aus Klasse A und rein in Klasse B ;D

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sinnvoll ist eine strukturierte Vorgehensweise. Trenne die drei Klassen 
so auf, daß Du je Klasse eine Headerdatei mit der Deklaration und ein 
C++-Sourcefile mit der Implementierung hast.

Wenn in einer der Klassen mit Pointern auf Instanzen der anderen Klassen 
zugegriffen werden soll, dann genügt i.d.R. eine Vorwärtsdeklaration 
der anderen Klasse:
1
// KlasseA.h
2
3
class KlasseB;  // Vorwärtsdeklaration
4
5
class KlasseA
6
{
7
public:
8
  KlasseA();
9
  ~KlasseA();
10
11
protected:
12
  void machwas();
13
14
  KlasseB* pAufB;
15
};

Das #include der Klassendeklaration für KlasseB ist erst bei der 
Implementierung der Funktionen von KlasseA erforderlich, also erst in 
der zu KlasseA gehörenden C++-Datei. Für die Deklaration in der 
Headerdatei aber genügt die Information, daß es eine Klasse namens 
"KlasseB" gibt, um Pointer darauf nutzen zu können. Und genau die stellt 
obige Vorwärtsdeklaration zur Verfügung.


Wie schon von anderen geschrieben: Besorg Dir ein gutes Buch über C++.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.