Klassen verschalten



  • Jo,

    also das ist der Anfang der Main:

    #include "Kontakt.h"
    #include "warten.h"

    void main()
    {

    Verwaltung v;

    char auswahl;

    Und das ist der Anfang der header Kontakt.h

    class Kontakt;

    class Verwaltung
    {
    public:
    Kontakt Kontakte[100];
    int z_Kontakt;
    };

    class Kontakt
    {
    public:

    string name ;
    string vorname;
    string strasse;
    string hausnummer;
    string plz;

    So will ich dann auf die einzelnen zugreifen

    cout << "Nachname: ";
    cin >> v.Kontakte[z_Kontakt].name;

    Aber geht net und hüpf gleich ausm Fenster weil ich gar keinen Plan hab. 😞



  • Deklarier 'Kontakt' mal _vor_ 'Verwaltung'. Kannst 'Kontakt' auch in eine
    eigene Headerdatei packen und includierst diese dann in Verwwaltung.h.

    mfg
    v R



  • phw schrieb:

    so:

    class Kontakt;
    
    class Verwaltung{
        //...
        Kontakt Kontakte[];
        //...
    }
    
    class Kontakt{
        //...
    }
    

    Also Forward-Deklarationen helfen nicht, wenn man eine Klasse instanziieren muß, nur bei Referenzen und Pointern darauf. Daher sollte man, solange es keine Abhängigkeit von Kontakt zu Verwaltung gibt die beiden einfach austauschen:

    class Kontakt {
        //...
    };
    
    class Verwaltung {
        //...
        Kontakt Kontakte[100];
        //...
    };
    

    Wobei sich natürlich fragt ob es nicht besser wäre eine dynamische Struktur wie std::vector oder std::list für die Kontakte zu benutzen, also statt:

    Kontakt Kontakte[100];
    

    lieber

    std::vector<Kontakt> Kontakte;
    

    aber das ist ein anderes Thema. 😉



  • Vielen Dank, das hat mir schonmal sehr weitergeholfen !!!

    Jetzt kann ich nur noch nicht mittels v.Kontakte[z_Kontakt].name; auf die Variable zugreifen. Obwohl ich ja in der Main v vom Datentyp Verwaltung definiert hab.

    Könnt ihr mir da vielleicht ach noch helfen????
    Oh Mann, das ist echt gar net so einfach.

    Grüße Der Colt



  • Hallo,

    #include <iostream>
    using namespace std;
    
    class contact
    {
            public:
                    string surename;
                    string name;
                    // ...
    };
    
    class contact_list
    {
            public:
                    contact contacts[100];
                    size_t index;
    };
    
    int main()
    {
            contact_list v;
            v.contacts[0].name = "hello_c++_world!";
            return 0;
    }
    

    So sollte es funktionieren...

    Caipi



  • Hallo, leider funktioniert es nicht, das ich einen Wert in einer Methode zuweise.
    Hier mein Code

    class Kontakt
    {
    public:
            string name ;
    	string vorname;
    //...
    
    int kontakt_anlegen()
    {
                    int z_Kontakt=0;
    
    		cout << endl;
    		cout << "\t Neuen Kontakt anlegen:" << endl;
    		cout << "\t -.-.-.-.-.-.-.-.-.-.-.";
    		cout << endl << endl;
    
    		cout << "Geben Sie die Adressen wie gefolgt ein!" << endl;
    		////////////////////
    		cout << "Nachname: ";
       		cin  >> v.Kontakte[z_Kontakt].name;
    

    Hier sagt mir der Compiler das v ein undefiniertes Symbol ist.

    Die Klasse Verwaltung sieht folgendermassen aus:

    class Verwaltung
    {
    public:
                    Kontakt Kontakte[100];
                    int z_Kontakt;
    };
    

    Die Main sieht so aus

    void main()
    {
    
            Verwaltung v;
            class Kontakt Kontakt;
    
            char auswahl;
    
         while(auswahl !=0)
            {
               cout << "******************************************" << endl;
               cout << "1 = Kontakt anlegen" << endl;
               cout << "Ihre Eingabe: ";
               cin >> auswahl;
    
               switch(auswahl) {
                    case '1' : {
                         Kontakt.kontakt_anlegen();
                         break;
                         }
    

    Muss ich hier noch etwas deklarieren oder reicht das?

    Möchte also in der Methode kontakt_anlegen die einzelnen Werte zuweisen.

    Vielen Dank schon mal



  • Colt71 schrieb:

    Hallo, leider funktioniert es nicht, das ich einen Wert in einer Methode zuweise.
    Hier mein Code

    class Kontakt
    {
    public:
            string name ;
    	string vorname;
    //...
    
    int kontakt_anlegen()
    {
                    int z_Kontakt=0;
    
    		cout << endl;
    		cout << "\t Neuen Kontakt anlegen:" << endl;
    		cout << "\t -.-.-.-.-.-.-.-.-.-.-.";
    		cout << endl << endl;
    
    		cout << "Geben Sie die Adressen wie gefolgt ein!" << endl;
    		////////////////////
    		cout << "Nachname: ";
       		cin  >> v.Kontakte[z_Kontakt].name;
    

    Hier sagt mir der Compiler das v ein undefiniertes Symbol ist.

    Die Klasse Verwaltung sieht folgendermassen aus:

    class Verwaltung
    {
    public:
                    Kontakt Kontakte[100];
                    int z_Kontakt;
    };
    

    Die Main sieht so aus

    void main()
    {
    
            Verwaltung v;
            class Kontakt Kontakt;
    
            char auswahl;
    
         while(auswahl !=0)
            {
               cout << "******************************************" << endl;
               cout << "1 = Kontakt anlegen" << endl;
               cout << "Ihre Eingabe: ";
               cin >> auswahl;
    
               switch(auswahl) {
                    case '1' : {
                         Kontakt.kontakt_anlegen();
                         break;
                         }
    

    Muss ich hier noch etwas deklarieren oder reicht das?

    Möchte also in der Methode kontakt_anlegen die einzelnen Werte zuweisen.

    Vielen Dank schon mal

    Du definierst ein Objekt vom Typ Verwaltung in der _main()_ funktion. Dieses Objekt hat jetzt aber nur einen _lokalen_ Gültigkeitsbereich, d.h. es ist _nur_ in der Funktion main() ansprechbar. Du versuchst aber das Objekt v aus der Funktion kontakt_anlegen() anzusprechen, was natürlich nicht geht...

    Dies ist jedoch nicht der einzige Fehler...
    Schau dir am besten nochmal das Kapitel Gültigkeitsbereiche, Namensräume, Klassen etc. an...

    /edit: bzg. void main().

    Caipi



  • Danke schön schonmal für die schnelle Antwort.

    Also sehe ich das jetzt richtig das ich, wenn ich das Objekt vom Typ Verwaltung vor der Main-Funktion definiere und auch berücksichtige das man z.B. void main nicht macht,... 😉 es dann global definiert ist und es somit ansprechen kann oder ist das auch mal wieder falsch??
    Wär super wenn ihr mit nen Tipp geben könntet, weil ich sonst eh nur googel und versuch was zu finden und das mach ich jetzt schon 2 Stunden. Bin nämlich ein bisschen unter Zeitdruck, das kommt noch dazu 😞

    Grüße Colt



  • Ich würde an deiner Stelle die Methode kontakt_anlegen() zu einem Member der Klasse Verwaltung machen.Da gehört die meiner Meinung nach eher hin.Dann kannst du auch auf dein Kontakte Array zugreifen.

    MfG Spacelord



  • Colt71 schrieb:

    Also sehe ich das jetzt richtig das ich, wenn ich das Objekt vom Typ Verwaltung vor der Main-Funktion definiere und auch berücksichtige das man z.B. void main nicht macht,... 😉 es dann global definiert ist und es somit ansprechen kann

    Theoretisch ja. Natürlich kannst du es erst dann ansprechen, wenn es auch sichtbar ist. Bsp

    void foo()
    {
        if (baz.bla) // bringt nichts, da baz noch nicht sichtbar ist
    }
    
    bar baz;
    
    int main()
    {
        if (baz.bla) // baz ist sichtbar, alles ok
    }
    

    Globale Variablen sind aber in den seltensten Fällen sinnvoll. Und noch seltener wirklich notwendig.
    Eine bessere Möglichkeit ist zB mit Parametern zu arbeiten.

    void foo(bar& x)
    {
        if (x.bla)
            x.blub = ...;
    }
    
    int main()
    {
        bar baz;
        foo(baz);
    }
    

Anmelden zum Antworten