ERLEDIGT
NEIN
NEIN
ANTWORTEN
7
7
ZUGRIFFE
1804
1804
EMPFEHLEN
-
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
[cpp]...[/cpp] 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
-
Hallo,
die Header sollten z.B. so aussehen:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#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
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#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„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
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:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#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„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
Danke an alle,
Problem gelöst!
Ähnliche Themen
-
VB.net/Visual Studio 2010 - Lokale Datenbank abfragen
Von embi im Forum .NET DatenverwaltungAntworten: 4Letzter Beitrag: 15.12.10, 13:21 -
Webservice: Visual Studio 2008 vs Visual Studio 2010 Express for Windwos Phone
Von Johannes7146 im Forum .NET Web und KommunikationAntworten: 4Letzter Beitrag: 27.09.10, 23:06 -
qt4 und Visual Studio 2010
Von countryqt30 im Forum C/C++Antworten: 7Letzter Beitrag: 18.07.10, 10:59 -
Visual Studio 2010 Ultimate Deutsches Sprachpaket
Von Danielku15 im Forum Coders TalkAntworten: 0Letzter Beitrag: 25.05.10, 10:46





Zitieren


Login






