Verwirrt über Sichtbarkeit von Variablen in Klassen



  • Hallo

    Ich bin Anfänger in C++ und möchte ein kleines Programm schreiben und habe folgendes Problem.
    Der Teil um den es geht soll aus dem Kommandozeilenargumenten Einstellungen wie die Server Adresse und so entnehmen. Dazu dient menu.cc, ich übergebe argc und argv und am Ende sollen diese Member von Menu sein....

    menu.h

    class Menu
    {
    	public:
    		char Pfad[1000];
    		char Server[255];
    		char User[255];
    };
    

    menu.cc

    #include <iostream>
    #include <getopt.h>
    #include "menu.h"
    
    int f_Menu(void);
    
    int Menu::neu(int int_menu , char* achr_menu[])
    {
    	int int_opt , int_re = 0 ; 
    	while ((int_opt = getopt(int_menu,achr_menu,"P:S:"))!= EOF )
    	{/*While 1*/
    	std::cout << "getopt" << int_opt << " : " << optarg << " \n";
    		switch (int_opt)
    		{/*switch1*/			
    		   case 'P': //Pfad
    			strncpy( Pfad , optarg , sizeof(Pfad)-1 );
    			break;
    		   case 'S': //Server
    		    strncpy( Server , optarg , sizeof(Server)-1 );
    			break;
    		}/*switch1*/		
        }/*While 1*/	 
    	int_re = f_Menu();
    	return int_re;
    }
    
    int f_Menu(void)
    {
    	int int_re=0;	
    	std::cout << "------ Ihre Eingaben ------\n";    
    	//Pfad
    	std::cout << "Daten Pfad : " << Pfad << "\n";    			
    	return int_re;
    }
    

    Die ersten Versuch waren auch ganz positiv, nur als ich die Funktion F_Menu einführte meldete g++.

    menu.cc: In function 'int f_Menu()':
    menu.cc:32: error: 'Pfad' was not declared in this scope
    

    Bin ernstlich verwirrt... wieso sehe ich Pfad nun auf einmal in der zweiten Funktion nicht mehr???? In der ersten (int Menu::neu) funktioniert das.

    Schon mal danke und so......



  • Die Funktion f_menu ist keine Methode der Klasse Menu und kann ohne Instanz der entsprechenden Klasse nicht auf deren Member zugreifen.



  • magier-phil schrieb:

    Ich bin Anfänger in C++ und möchte ein kleines Programm schreiben und habe folgendes Problem.

    Wenn wir mal von den Typischen C-Aspekten deiner Anwendung absehen (und den Problemen die du dir damit noch erkaufen wirst; es sieht eher nach C mit Klassen, als C++ aus), sind deine wesentlichen beiden Probleme wohl:

    a) Gültigkeitsbereich (Scope) von Variablen
    b) Was ist eine Klasse, und was ein Objekt

    menu.h

    class Menu
    {
      public:
        char Pfad[1000];
        char Server[255];
        char User[255];
    };
    

    Eine Klasse ist im wesentlichen eine Schablone. Hier besagst du das jede Instanz (konkrete Variable) der Klasse Menu über die Membervariablen Pfad, Server, User verfügt. Diese Membervariablen gehören eindeutig zu der Instanz, und können auch nur über diese zugegriffen werden.

    ...
    Menu m; // Wenn du eine Instanz von Menu anlegst, kannst du über
            // m.Pfad beispielsweise auf dessen Membervariable Pfad zugreifen
    Menu m2; // Dies ist eine weitere Instanz der Klasse, mit einem eigenen 
             // Variablensatz
    ...
    

    Zudem gelten Variablen immer nur von ihrer Deklaration bis zum Ende des ihnen umgebenen Kontextes.

    int main()
    {
      int i = 2;
      {
        int j = 4;
      } // <-- Hier hört j auf zu existieren
    } // <-- Hier hört i auf zu existieren
    

    Vielleicht solltest du dir erst einmal ein gutes C++ Buch antun (z.B. Thinking in C++ oder den C++ Primer).

    cu André



  • @asc
    Ist vielleicht besser anstatt sofort das Array in der Klasse, im Konstruktur mit new zu reservieren. Und im Destruktor dann wunderschön deleten...



  • way schrieb:

    @asc
    Ist vielleicht besser anstatt sofort das Array in der Klasse, im Konstruktur mit new zu reservieren. Und im Destruktor dann wunderschön deleten...

    Ich würde garnicht mit Arrays arbeiten (alleine schon wegen Kopierverhalten etc.) sondern eher std::vector oder std::tr1::array einsetzen (davon abgesehen das ich auch Variablen in der Öffentlichen Schnittstelle einer Klasse vermeide).

    Und dynamische Speicherverwaltung meide ich, wenn ich sie nicht wirklich benötige, bzw. überlasse ich sie gerne den Interna der Standardbibliothek und Boost.

    cu André



  • way schrieb:

    @asc
    Ist vielleicht besser anstatt sofort das Array in der Klasse, im Konstruktur mit new zu reservieren. Und im Destruktor dann wunderschön deleten...

    Ja, und zusätzlich noch Kopierkonstruktor und Zuweisungsoperator implementieren.

    Bei dem Beispiel hier sollten statische Arrays durchaus berechtigt sein, aber ich würde wie asc sowieso zu Containern greifen.



  • oh WOW....und danke für die vielen Antworten!!!

    Ja ich komme von C..... habe aber mal ganz früher VS.NET benutz daher kenne ich Klassen und Objekte. Daher ja meine Grundidee, eine Objekt zu erschaffen das wie ein Adressbuch leicht aufzurufende Daten für einen MySQL Server enthält.

    Es sind meine wirklich aller ersten Gehversuche in C++ daher noch mal danke für die vielen Tipps, ich habe zwar drei dicke Bücher aber die sind gelindegsagt....ziemlich komplex und nicht immer hilfreich......

    Werde versuchen mich weiter in das "unbekannte Land" vor zu tasten und weiß jetzt ja wo ich immer die beste Hilfe bekomme. DANKE


Anmelden zum Antworten