Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » StringArray als Bezeichnung für Pointer verwenden???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.12.2016, 18:24 Uhr
~Julia_w
Gast


string bike[]={"Suzuki_Bandit", "Honda_TransAlp", "BMW_F_650_GS", "Kawasaki_ZZR1400"};
struct Kunde customer[5];
for(int i=0; i<4; i++)
{
eingabe(&customer[i]);
Motorrad *bike[i]=new Motorrad(customer[i].name, customer[i].vorname, customer[i].adresse, customer[i].telefon, customer[i].gebJahr, customer[i].fhrschein_A, customer[i].uebergabe); //Instanz von Motorrad deklarieren
bike[i]->datenausgeben(); // Aufruf der Funktion datenausgabe()
if((bike[i]->fhrschein_A==false)||(bike[i]->uebergabe==true))delete bike[i]; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
}
system("PAUSE");
return EXIT_SUCCESS;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.12.2016, 18:29 Uhr
~Julia_w
Gast



C++:
/*Das Programm soll mindestens folgende Anforderungen erfullen: Verwaltung der Kunden:
- Daten erfassen. Die Erfassung der Daten soll uber istream (>>) Operatoruberladung erfolgen.
- Alle Kundendaten ausgeben. Die Ausgabe soll uber ostream (<<) Operatoruberladung erfolgen.
Verwaltung der Reservierungen:
- Reservierung vornehmen
- Motorrad herausgeben (mit der Abfrage des Kundenvor- und nachnamens)
Dateiverwaltung:
- Der aktuelle Stand der Reservierungen soll in die Datei .reservierungen.txt¡§ geschrieben werden. Falls die
Datei noch nicht existiert soll sie angelegt werden, ansonsten sollen die Daten an das Ende der Datei
angehangt werden. Lesen der Daten aus der Datei ist nicht gefordert!*/


#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <fstream>
using namespace std;

class Reservierung
{
    friend class Motorrad;
private:
    string name, vorname, adresse;
    int telefon, gebJahr;

public:
    bool fhrschein_A;
    bool uebergabe;
    // Konstruktormethode mit Elementinitialisierung
    Reservierung(string n, string v, string addy, int tele, int born, bool license, bool release): name(n), vorname(v), adresse(addy), telefon(tele), gebJahr(born), fhrschein_A(license), uebergabe(release) {}
    ~Reservierung() {} //virtuelle Funktion macht classReservierung zur abstrakten Klasse
};

class Motorrad:public Reservierung
{
private:

public:  // Konstruktormethode mit Elementinitialisierung
    Motorrad(string n, string v, string addy, int tele, int born, bool license, bool release): Reservierung(n, v, addy, tele, born, license, release) {}
    ~Motorrad()
    {
        cout<<"Reservierung gelöscht!"<<endl;   //Löschen der Reservierung, bzw. freigeben des Speichers //virtuelle Funktion muss überschrieben werden
    }
    void datenausgeben() //schreiben des Reservierungsdaten in reservierung.txt
    {
        cout << "Motorrad: " << name << ", " << vorname << ", " << adresse << ", " << telefon << " " << endl;
        cout << "Fuehrerschein Klasse A vorhanden?: " <<fhrschein_A  << endl;
        fstream f;
        f.open("reservierungen.txt", ios::out | ios::app);
        f << "Motorrad: " << name << ", " << vorname << ", " << adresse << ", " << telefon << " " << "Fuehrerschein Klasse A vorhanden?: " <<fhrschein_A  << "Uebergabe durchgeführt? "<< uebergabe<<endl << endl;
        f.close();
    }
};

struct Kunde
{
    string name, vorname, adresse;
    int gebJahr, telefon;
    bool fhrschein_A, uebergabe;
};

void eingabe(struct Kunde *zeiger)
{
    cout<<"Name eingeben. "<<endl;
    cin>>(*zeiger).name;
    cout<<"Nachname eingeben. "<<endl;
    cin>>(*zeiger).vorname;
    cout<<"Adresse eingeben. "<<endl;
    cin>>(*zeiger).adresse;
    cout<<"Telefonnummer eingeben. (nur Zahlen!)"<<endl;
    cin>>(*zeiger).telefon;
    cout<<"Geburtstag eingeben. [ddmmyy]"<<endl;
    cin>>(*zeiger).gebJahr;
    cout<<"Fuehrerschein Klasse A vorhanden? [ja=1 || nein=0]"<<endl;
    cin>>(*zeiger).fhrschein_A;
    cout<<"Motorad uebergeben? [ja=1 || nein=0]"<<endl;
    cin>>(*zeiger).uebergabe;
}

int main(int argc, char *argv[])
{
    string bike[]={"Suzuki_Bandit", "Honda_TransAlp", "BMW_F_650_GS", "Kawasaki_ZZR1400"};
    struct Kunde customer[5];
    for(int i=0; i<4; i++)
    {
        eingabe(&customer[i]);
        Motorrad *bike[i]=new Motorrad(customer[i].name, customer[i].vorname, customer[i].adresse, customer[i].telefon, customer[i].gebJahr, customer[i].fhrschein_A, customer[i].uebergabe); //Instanz von Motorrad deklarieren
        bike[i]->datenausgeben(); // Aufruf der Funktion datenausgabe()
        if((bike[i]->fhrschein_A==false)||(bike[i]->uebergabe==true))delete bike[i]; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}






Bei der folgenden main erhalte ich folgende Fehlermeldung:
GProgrammieren C\ESA 2_2\main.cpp variable-sized object `bike' may not be initialized

Wenn ich aber statt bike[i] den Text "BMW_F_650_GS" eingebe funktioniert es.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2016, 14:01 Uhr
ao

(Operator)


Motorrad *bike[i] deklariert ein Array der Länge i von Pointern auf Motorrad, also mehrere Pointer, organisiert als Array. Diesem Gebilde weist du dann einen einzelnen Motorrad-Pointer (den aus new Motorrad) zu - das geht nicht. Du müsstest Motorrad * bike[N] außerhalb der for-Schleife deklarieren und dann in der Schleife sagen:

bike[i] = new Motorrad ( .... );

Damit nimmst du dir das i-te bike und weist es zu.

Beachte auch, dass durch das Motorrad * bike[] das Array string bike[] verdeckt wird - vermutlich willst du das nicht. Nimm einen anderen Namen.


Zitat:
Wenn ich aber statt bike[i] den Text "BMW_F_650_GS" eingebe funktioniert es.

Wie meinst du das? Zeig das mal als Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2016, 23:06 Uhr
~Julia_w
Gast


Hallo ao,

so meinete ich das:

Zitat:
Wenn ich aber statt bike[i] den Text "BMW_F_650_GS" eingebe funktioniert es.



C++:
int main(int argc, char *argv[])
{
    //string bike[]={"Suzuki_Bandit", "Honda_TransAlp", "BMW_F_650_GS","Kawasaki_ZZR1400"};
    struct Kunde customer[5];
    //for(int i=0; i<4; i++)
    /*{
        eingabe(&customer[i]);
        Motorrad *bike[i]=new Motorrad(customer[i].name, customer[i].vorname, customer[i].adresse, customer[i].telefon, customer[i].gebJahr, customer[i].fhrschein_A, customer[i].uebergabe); //Instanz von Motorrad deklarieren
        bike[i]->datenausgeben(); // Aufruf der Funktion datenausgabe()
        if((bike[i]->fhrschein_A==false)||(bike[i]->uebergabe==true))delete bike[i]; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
    
        }*/

        eingabe(&customer[1]);
        Motorrad *Suzuki_Bandit=new Motorrad(customer[1].name, customer[1].vorname, customer[1].adresse, customer[1].telefon, customer[1].gebJahr, customer[1].fhrschein_A, customer[1].uebergabe); //Instanz von Motorrad deklarieren
        Suzuki_Bandit->datenausgeben(); // Aufruf der Funktion datenausgabe()
        if((Suzuki_Bandit->fhrschein_A==false)||(Suzuki_Bandit->uebergabe==true))delete Suzuki_Bandit; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf

        eingabe(&customer[2]);
        Motorrad *Honda_TransAlp=new Motorrad(customer[2].name, customer[2].vorname, customer[2].adresse, customer[2].telefon, customer[2].gebJahr, customer[2].fhrschein_A, customer[2].uebergabe); //Instanz von Motorrad deklarieren
        Honda_TransAlp->datenausgeben(); // Aufruf der Funktion datenausgabe()
        if((Honda_TransAlp->fhrschein_A==false)||(Honda_TransAlp->uebergabe==true))delete Honda_TransAlp; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf

        
    system("PAUSE");
    return EXIT_SUCCESS;
}



Zitat:
Beachte auch, dass durch das Motorrad * bike[] das Array string bike[] verdeckt wird - vermutlich willst du das nicht. Nimm einen anderen Namen.

kannst du das bitte als Beispiel machen? ich will doch den stringInhalt von bike[] für die Klasse Motorrad, warum soll ich da einen anderen Namen wählen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.12.2016, 08:54 Uhr
ao

(Operator)


Ach so.

Motorrad * Suzuki_Bandit ist EIN Pointer auf ein Motorrad-Objekt.
Motorrad * Suzuki_Bandit = new Motorrad .... deklariert den Pointer, erzeugt ein neues Motorrad-Objekt und weist das Objekt dem Pointer zu. Das passt.

Motorrad * bikes[i] ist ein Array von i Pointern auf Motorrad-Objekte. Diesem Gebilde kannst du nicht ein einzelnes Motorrad-Objekt zuweisen, das passt nicht. Das wäre semantisch dasselbe wie:


C++:
int zahlen[10];  // ein Array von Ganzzahlen
zahlen = 0;   // Dem Array (!) eine Ganzzahl zuweisen - geht nicht

// -----------------------------------------

int zahlen[10];  // ein Array von Ganzzahlen
for (i = 0; i < 10; i++)
    zahlen[i] = irgendwas;   // jedem Array-Element was zuweisen: so gehts.



Siehst du es?


Zitat von ~Julia_w:


Zitat:
Beachte auch, dass durch das Motorrad * bike[] das Array string bike[] verdeckt wird - vermutlich willst du das nicht. Nimm einen anderen Namen.

kannst du das bitte als Beispiel machen? ich will doch den stringInhalt von bike[] für die Klasse Motorrad, warum soll ich da einen anderen Namen wählen?


Du hast in der main ein Array string bike [] und in der For-Schleife ein Array Motorrad * bike []. Zwei Variablen mit gleichem Namen. Das ist nach C++-Regeln erlaubt, aber innerhalb der Schleife ist das Motorrad*-Array gültig und das String-Array verdeckt und nicht sichtbar. Du musst unterschiedliche Namen vergeben, um das String-Array in der Schleife verwenden zu können.

Ich schlage vor:
string bikeNames[] = { "Suzuki", "Honda", "BMW", "Kawasaki" };

Dieser Post wurde am 05.12.2016 um 09:49 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.12.2016, 20:06 Uhr
~Julia_w
Gast


es funktioniert nicht


C++:
int main(int argc, char *argv[])
{
    string bikenames[]={"Suzuki_Bandit", "Honda_TransAlp", "BMW_F_650_GS","Kawasaki_ZZR1400"};
    struct Kunde customer[5];
    for(int i=0; i<4; i++)
    {
        eingabe(&customer[i]);
        Motorrad *bike[]=new Motorrad(customer[i].name, customer[i].vorname, customer[i].adresse, customer[i].telefon, customer[i].gebJahr, customer[i].fhrschein_A, customer[i].uebergabe); //Instanz von Motorrad deklarieren
        bike[i]->datenausgeben(); // Aufruf der Funktion datenausgabe()
        if((bike[i]->fhrschein_A==false)||(bike[i]->uebergabe==true))delete bike[i]; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}



Fehlerlog:
GProgrammieren C\ESA 2_2\main.cpp: In function `int main(int, char**)':
GProgrammieren C\ESA 2_2\main.cpp:89: error: initializer fails to determine size of `bike'

GProgrammieren C\ESA 2_2\main.cpp:89: error: invalid initializer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.12.2016, 21:46 Uhr
ao

(Operator)


Natürlich nicht, lies doch meinen ganzen Post, auch die erste Hälfte. bike ist ein Array von Pointern, kein einzelner Pointer. Du willst

Motorrad bike [5];

außerhalb der For-Schleife und

bike[i] = new Motorrad ( .....

in der Schleife.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: