Visual Studio 2010 error C2061 'identifier'

afg_style

Mitglied
Hallo Leute,
Ich versuche zurzeit C++ zu lernen. Mein derzeitiger Entwicklungsumgebung ist Visual Studio 2010. Mein erstes Programm ist ein Konsolenprogramm:
Klassen:
Fahrrad
Schueler

Folgendes Problem:
Die Headerdatei Fahrrad.h:

#pragma once
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Schueler.h"

#ifndef _FAHRRAD_H_
#define _FAHRRAD_H_

using namespace std;
using namespace System;

public class Fahrrad
{
private:
int rahmenNr;
string farbe;
Schueler besitzer;

public:
Fahrrad(int nr, string farbe);
Fahrrad();
};
#endif


Die Headerdatei Schueler.h:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>


#ifndef _SCHUELER_H_
#define _SCHUELER_H_

using namespace System;
using namespace std;
#include "Fahrrad.h"

public class Schueler
{
private:
string vName;
string nName;
string strasse;
string plz;
string ort;

public:
Schueler(string vName, string nName, string strasse, string plz, string ort);
void WhgWechsel(string strasse, string plz, string ort);
void AddBike(Fahrrad bike);
void RemoveBike(Fahrrad bike);
string toString();
};
#endif


Jedes Mal wenn ich es Debuggen (compilieren) will, dann kommt die Fehlermeldung C2061 identifier 'Fahrrad'

Original Fehlermeldung:
1>------ Build started: Project: BikeDb, Configuration: Debug Win32 ------
1> BikeDb.cpp
1>c:\users\farid\desktop\bikedb\bikedb\Schueler.h(26): error C2061: syntax error : identifier 'Fahrrad'
1>c:\users\farid\desktop\bikedb\bikedb\Schueler.h(27): error C2061: syntax error : identifier 'Fahrrad'
1> Fahrrad.cpp
1>c:\users\farid\desktop\bikedb\bikedb\Schueler.h(26): error C2061: syntax error : identifier 'Fahrrad'
1>c:\users\farid\desktop\bikedb\bikedb\Schueler.h(27): error C2061: syntax error : identifier 'Fahrrad'
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



Ich kenn mich leider überhaupt nich mehr aus, was das Problem sein sollte.
Falls sich jemand auskennen solte ---> Bitte antwort schreiben
 
Willkommen bei tutorials.de :)

Wirklich sicher bin mir jetzt auch nicht, wo der Fehler liegt, aber schreib vor den Klassennamen Fahrrad und Schueler kein public.
Im Gegensatz zu C#/Java gehört da keines hin.

Unt trotz aller pragma-once und ifndefs ist ein Gegenseitiges Include nicht so schön...

Und noch ein kleiner Tipp zum Forum: Statt deinen Code in anderen Farben zu schreiben, kannst du ihn in
[code=cpp]...[/code] einschließen. Dann hat man auch gleich Zeilennummern etc. dazu.

Gruß
 
Du hast die Klassen Fahrrad und Schueler unglücklich verknüpft.

Wie sheel schon sagte: Das gegenseitige Include ist in C++ leider nicht so ohne Weiteres möglich. Fahrrad.h included Schueler.h, welches wiederrum Fahrrad.h includet. Bei einem der beiden musst du auf Forward-Deklaration ausweichen.

Jedes Fahrrad hat seinen eigenen Schüler. Da würde ich eher einen Pointer zu dem Schüler nehmen. Falls nicht, hat das Fahrrad eine eigene Schüler-Instanz, die NICHT dem besitzenden Schüler entspricht.
Bei C++ entspricht die Semantik nicht der von Java/C#!

D.h. wenn du eine Schueler-Instanz hast, dort AddBike aufrufst, und dort innerhalb den Schueler des Fahrrads auf sich selbst setzt, erzeugst du in dem Moment eine Kopie des Schuelers.

Überlege nochmal, wer in der Klassenhierarchie wen besitzt.
 
Danke Leute, aber das alles hilft mir auch nicht weiter.
Ich habe jetzt alles so umgeändert, wie ihr es mir empfohlen habt, aber der Fehler ist immer noch da.

Ich werde mal mein Projekt (Visual Studio 2010 C++) inklusive Angabe uploaden und ihr könnt es dann selber ausprobieren. Und falls ihr es schaffen solltet, dann bitte ich euch mir mitzuteilen, was das Problem war bzw. mein Projekt bearbeiten und es wieder uppen!

Danke
 

Anhänge

  • FahrradDatenbank.zip
    3,2 MB · Aufrufe: 16
Hallo,

die Header sollten z.B. so aussehen:

C++:
#ifndef _SCHUELER_H_
#define _SCHUELER_H_

#include "stdafx.h"
#include <string>
#include <list>

// Vorwärts-Deklaration: "es gibt eine Klasse Fahrrad"
class Fahrrad;

class Schueler
{
private:
	std::string vName;
	std::string nName;
	std::string strasse;
	std::string plz;
	std::string ort;

	list<Fahrrad *> bike;

public:
	Schueler(std::string vName, std::string nName, std::string strasse, std::string plz, std::string ort);
	void WhgWechsel(std::string strasse, std::string plz, std::string ort);
	void AddBike(Fahrrad *bike);
	void RemoveBike(Fahrrad *bike);
	std::string ToString();
};

#endif

C++:
#ifndef _FAHRRAD_H_
#define _FAHRRAD_H_

#include "stdafx.h"
#include <string>

// Vorwärts-Deklaration: "es gibt eine Klasse Schueler"
class Schueler;

class Fahrrad
{
private:
	int rahmenNr;
	std::string farbe;

	Schueler *besitzer;

public:
	Fahrrad(int nr, std::string farbe);
	void SetBesitzer(Schueler *besitzer);
	Schueler *GetBesitzer();
	std::string ToString();
};

#endif

Zusätzliche Anmerkungen:
  • #pragma once und Include-Wächter (#ifndef _SCHUELER_H_ …) erfüllen dieselbe Aufgabe. Verwende entweder das eine oder das andere (bevorzugt Include-Wächter, zwecks Portabilität).
  • using namespace … gehört nicht in den Header. Niemals. Dadurch verschmutzt du den Namensraum von Dateien, die den Header einbinden.

Grüße,
Matthias
 
Ich danke dir Matthias!
Somit hast du ein meines Problems gelöst

Aber, das mit der liste in Visual Studio 2010 C++ funktioniert nicht ganz und ich weiß auch nicht wo der Fehler liegt:

Schueler hat mehrere Fahrräder:
Schueler.h:
C++:
#ifndef _SCHUELER_H_
#define _SCHUELER_H_

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cliext\list> //Konsolen Anwendung deswegen in Visual Studio cliext\list

class Fahrrad;

class Schueler
{
private:
	std::string vName;
	std::string nName;
	std::string strasse;
	std::string plz;
	std::string ort;

	cliext::list<Fahrrad *> bike;

public:
	Schueler(std::string vName, std::string nName, std::string strasse, std::string plz, std::string ort);
	~Schueler();
	void WhgWechsel(std::string strasse, std::string plz, std::string ort);
	void AddBike(Fahrrad *bike);
	void RemoveBike(Fahrrad *bike);
	std::string toString();
};
#endif

Fehlermeldung:
1>------ Build started: Project: BikeDb, Configuration: Debug Win32 ------
1> BikeDb.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cliext\list(107): error C3225: generic type argument for 'TValue' cannot be 'Fahrrad *', it must be a value type or a handle to a reference type
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cliext\list(1272) : see reference to class template instantiation 'cliext::impl::list_impl<_Value_t,_Is_ref>' being compiled
1> with
1> [
1> _Value_t=Fahrrad *,
1> _Is_ref=false
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cliext\list(1475) : see reference to class template instantiation 'cliext::impl::list_base<_Value_t,_Is_ref>' being compiled
.......
........
.........
1>c:\users\farid\desktop\bikedb\bikedb\Schueler.h(20): error C3076: 'Schueler::bike' : you cannot embed an instance of a reference type, 'cliext::list<_Value_t>', in a native type
1> with
1> [
1> _Value_t=Fahrrad *
1> ]
1>Schueler.cpp(10): fatal error C1903: unable to recover from previous error(s); stopping compilation
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
 
Hallo,

es scheint als ob du ein .NET-Projekt erstellt hättest (C++/CLI). Ist das so beabsichtigt? Wenn es in deinem Kurs um C++ (ohne .NET) geht, hättest du ein Win32-Konsolenprojekt erstellen müssen. Unabhängig davon kannst du immer std::list verwenden. Ob dein Programm eine Konsolenanwendung ist oder nicht hat damit nichts zu tun.

Grüße,
Matthias
 
Zurück