Zugriff von Klasse auf Werte von Variablen fremder Klasse



  • Hallo

    also ich habe momentan folgendes Problem

    ich schreibe ein Programm.
    Dort gibt es 2 Klasse die benutzt werden.
    eine klasse cl_init ist zum auslesen der werte aus einer ini-datei zuständig.
    die klasse cl_parser zerlegt eine bestimmte datei.

    für die klasse cl_parser brauche ich daten, die in der cl_init aus der ini-datei ausgelesen werden.

    aber irgendwie funktioniert das alles nichts...
    die variablen sind als public definiert...

    ich hab auch schon versucht eine oberklasse zu definieren...wo dann die cl_init die daten reinschreibt...
    aber wenn ich aus der cl_parser heraus auf die daten in der oberklasse zugreifen will sind die immer leer.

    weiß jemand wie man bei sowas vorgeht?

    bin für schnelle hilfe sehr dankbar

    chris



  • cl_init init("Datei.txt");
    cl_parser parser(init.DEIN_MEMBERNAME);
    

    So greifst du auf die Daten aus der
    cl_init zu, wenn sie public sind.



  • Also das Problem ist, dass cl_Parser auf die Daten von cl_Init zugreifen will, die Daten sind aber irgendwie nicht da?
    So pauschal kann ich da schlecht was zu sagen. Deshalb: Poste mal bitte etwas Source-Code (nicht alles!) - die relevanten Stellen sind die Stellen, wo ein Objekt der cl_Init mit einem Objekt der cl_Parser-Klasse interagiert. Und: Spielt sich alles in einer Exe-Datei ab?



  • also ich hab hier nen ausschnitt aus der cl_init
    die variable z.b. tmp_dir wird mit einer methode verändert...
    also aus der ini-datei ausgelesen

    cl_init(void);
    	~cl_init(void);
    	void read_ini();
    	void write_ini();
    	int max_url_length;
    	string var_name;
    
    //Variablen aus INI-File
    //GENERAL
    	string rpc_url;
    	string tmp_dir;
    	string exp_dir;
    	string exp_file;
    //DEBUG
    int logging;
    string log_file;
    

    bei cl_parser..will ich beim konstruktor die datei öffnen
    für die pfadangabe brauch ich dann die variable tmp_dir
    um mir den pfad bei "TMP/ava_gehe.txt" zusammenzusetzen
    also dass dann z.b. steht cl_init::tmp_dir+"/"+cl_init::datei

    cl_parser::cl_parser(void)
    {
    
    	read.open("TMP/ava_gehe.txt",ios_base::in);		//Datei zum lesen öffnen
    }
    

    und so möchte ich dann auch halt die daten aus der ini in der klasse parser verwenden

    ja es spielt sich alles in einer exe ab

    wenn noch mehr sourcecode fürs verständnis benötigt wird...einfach sagen



  • Gut. Aber ist dir auch klar, dass, während das Programm dann läuft, nicht eine Klasse die Daten besitzt, sondern nur ein Objekt vom Typ der Klasse?
    Deshalb brauchst du ja auch ein Objekt von der Klasse. Ein Beispiel:

    class cl_Init
    {
    public:
        string exp_file;
    
        bool LoadTheData();
    };
    
    class cl_Parser
    {
    public:
        cl_Parser( cl_Init* obj_of_init ) // Der Konstruktor von cl_Parser empfängt einen Zeiger auf ein Objekt von cl_Init
        {
            string blubb = obj_of_init->exp_file; // Und kann so auf die Daten des Objekts zugreifen
        }
    };
    
    int main()
    {
        cl_Init obj, obj2; // 2 Objekte, beide haben eine unabhängige Variable "exp_file".
        obj.LoadTheData(); // Das erste Objekt hat jetzt einen gültigen/belegten String "exp_file".
        cl_Parser parser( &obj ); // Jetzt haben wir einem Objekt der Klasse cl_Parser einen Zeiger auf ein Objekt mitgegeben
        return 0;
    }
    


  • //Bereich in der int main
    //Informationen aus der INI-Datei lesen
    
    	cl_init init;
    	init.read_ini();
    
    //Parser aufrufen
    	cl_parser parser(&init);	//objekt erschaffen
    
    //cl_parser.h
    cl_parser(cl_init *settings);		//Konstruktor
    
    //cl_init.cpp
    cl_parser::cl_parser(cl_init *settings)
    {
    
    	//remove(cl_init::exp_dir+"/"+cl_init::exp_file);	
    	//remove("EXP/sql_update_products.sql");			//Datei für mysql-update beim init löschen
    	read.open("TMP/ava_gehe.txt",ios_base::in);		//Datei zum lesen öffnen
    }
    

    krieg ich fehler z.b. error C2143: Syntaxfehler: Es fehlt ')' vor '*'
    an der stelle "cl_parser(cl_init *settings);"



  • legion schrieb:

    krieg ich fehler z.b. error C2143: Syntaxfehler: Es fehlt ')' vor '*'
    an der stelle "cl_parser(cl_init *settings);"

    Dein Compiler muss an der Stelle die Klasse "cl_Init" kennen. Entweder per Forward-Declaration, also vor in der "cl_Parser.h" vor die Klasse ein "class cl_Init;" schreiben (dann musst du in die "cl_Parser.cpp" die Datei "cl_Init.h" einbinden), oder, falls die Klasse cl_Init die Klasse cl_Parser nicht kennen muss, kannst du die "cl_Init.h" gleich in die "cl_Parser.h" einbinden.



  • ich hatte die cl_init.h eingebunden^^
    die wird ja auch erkannt (intellisense erkennts und zeigt mir den schnodder)

    mh....soll ich dir mal den kompletten sourcecode schicken bzw posten?

    EDIT:

    also ich hab vor die klasse class cl_parser
    ein class cl_init; geknallt...und nun funkzt das....danke erstmal
    aber wieso??? 😕

    und noch nen problem was sich grad ergibt 😣

    remove((settings->exp_dir).c_str()+"/"+(settings->exp_file).c_str());
    

    error C2110: '+': Zwei Zeiger können nicht addiert werden

    hast du da vielleicht auch rat? 😞

    EDIT2:

    this->temp=settings->exp_dir+"/";
    this->temp=this->temp.append(settings->exp_file);
    
    remove(temp.c_str());
    

    so gehts...ja....aber gibts dafür vielleicht ne bessere methode?

    EDIT3: (Bin ma gespannt wieviele edits noch kommen xD)

    remove((settings->exp_dir+"/"+settings->exp_file).c_str());
    

    das geht auch 🙂
    ist die beste alternative für das, was ich mache, oder?!

    und....diese referenz muss ich bei jeder anderen methode in cl_parser immer mitgeben oder wie?

    EDIT4:
    also das hab ich jetzt so gemacht...ich hab in konstruktor ja den zeiger auf das objekt...
    nun hab ich noch in private folgendes definiert:

    private:
    cl_init *settings;

    und im konstruktor:
    this->settings=settings;

    damit kann ich dann das objekt in der ganzen klasse benutzen 🙂 *freu*



  • Schön, dass jetzt alles klappt! 🙂

    Wegen settings->exp_dir.c_str() + "/" + settings->exp_file.c_str() :
    exp_dir ist ein Objekt vom Typ string. "/" ist ein const char* und damit ein Zeiger, Zeiger kann man nicht addieren, da sie ja nur auf eine Stelle im Arbeitsspeicher zeigen. Aber, weil man in C++ ja so schick Operatoren überladen kann, ist von der Klasse string der Operator '+' überladen - damit kann man dann Zeichenketten aneinanderhängen. Deshalb geht z.B. exp_dir + "hallo" + "xyz" , einfach weil vorne ein Objekt vom Typ string (und damit kein Zeiger) ist. Die Funktion "c_str()" gibt aber halt wieder einen const char* zurück, mit dem man nix verknüpfen kann. Deshalb einfachste Lösung:

    remove( settings->exp_dir + "/" + settings->exp_file );
    

    Und wegen dem "class cl_Init;":
    In C++ werden immer die .cpp-Dateien geparst. Wenn die Datei mittels "#include "xy" Dateien einbindet, wird einfach quasi aller Text aus dieser Datei genommen und in die .cpp-Datei eingefügt, dahin wo das "#include" steht.
    Wenn der Compiler dann durch die Cpp-Datei durchgeht und sich alles genau anschaut, müssen alle verwendeten Typen bekannt sein. Wenn du einfach irgendwo hinschreibst CMeinKlasse y; , sagt der Compiler, er kennt "CMeineKlasse" nicht. Wenn du diese aber in einer Header-Datei deklarierst und die Header-Datei einbindest, steht sie dann ja quasi auch in deiner cpp-Datei drin (durch das include). Und deshalb kennt der Compiler die Klasse dann.
    Wenn man aber Klassen hat, die sich gegenseitig einbinden, klappt das ganze nicht - dafür gibts dann Forward-Deklarationen, die dem Compiler sagen "hey, es gibt noch ne Klasse 'cl_Init', die kriegst du aber später noch zu Gesicht". Und deshalb brauchtest du das (hoffe das war alles halbwegs verständlich) 🙂


Anmelden zum Antworten