tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1804
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    afg_style afg_style ist offline Mitglied
    Registriert seit
    Feb 2011
    Beiträge
    24
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    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ß
     

  3. #3
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  4. #4
    afg_style afg_style ist offline Mitglied
    Registriert seit
    Feb 2011
    Beiträge
    24
    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
    Angehängte Dateien Angehängte Dateien
     

  5. #5
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    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

  6. #6
    afg_style afg_style ist offline Mitglied
    Registriert seit
    Feb 2011
    Beiträge
    24
    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 ==========
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    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

  8. #8
    afg_style afg_style ist offline Mitglied
    Registriert seit
    Feb 2011
    Beiträge
    24
    Danke an alle,
    Problem gelöst!
     

Ähnliche Themen

  1. VB.net/Visual Studio 2010 - Lokale Datenbank abfragen
    Von embi im Forum .NET Datenverwaltung
    Antworten: 4
    Letzter Beitrag: 15.12.10, 13:21
  2. Webservice: Visual Studio 2008 vs Visual Studio 2010 Express for Windwos Phone
    Von Johannes7146 im Forum .NET Web und Kommunikation
    Antworten: 4
    Letzter Beitrag: 27.09.10, 23:06
  3. qt4 und Visual Studio 2010
    Von countryqt30 im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 18.07.10, 10:59
  4. Visual Studio 2010 Ultimate Deutsches Sprachpaket
    Von Danielku15 im Forum Coders Talk
    Antworten: 0
    Letzter Beitrag: 25.05.10, 10:46

Stichworte