Namespace Problem



  • Hallo zusammen. Ich programmiere als Hobby C++ und habe mir ein Buch darüber gekauft. Nun wolle ich ein kleines Programm mit mehreren Quellcodedateien erstellen.

    Das Problem, ich habe in der ersten Quellcode Datei einen Namespace erstellt. Doch wie kann ich aus einer anderen Quellcode Datei auf diesen zugreifen? Oder wie mache ich den Namespace in der zweiten Datei bekannt?

    zB:
    //--------------------quellcode1.cpp----------------------

    #include <iostream>
    using namespace std;

    void edit_alter(); // Funktion aus zweiter Quellcode Datei

    namespace daten
    {
    int alter;
    }

    int main()
    {
    cout<< "Gib dein Alter ein: ";
    cin >> daten::alter;

    edit_alter();
    cout<< "Nun sind sie "<< daten::alter<< " alt.\n";
    return 0;
    }

    //--------------------quellcode2.cpp-----------------------------
    //test.cpp

    void edit_alter()
    {
    daten::alter = 20; // Geht eben nicht!
    }

    Ich habe auch schon den Namespace in einen Header gesteckt und mit den Präprozessor-Direktiven rumgespielt. Doch mit denen komme ich noch nicht so richtig klar. Könnt ihr mir sagen, wie das Problem zu lösen ist?

    Vielen Dank schon mal im Voraus 🙂



  • // test2.cpp
    namespace daten {
      extern int alter;
    }
    ...
    daten::alter = 42;
    

    Falls dir das nichts sagt, solltest du die Namespaces erstmal wieder beiseite legen, die sind am Anfang (von std abgesehen) nicht wichtig.



  • Das Problem ist, das weder der Namespace noch die Variable in quellcode2 bekannt sind.
    Du könntest die Variable in quellcode1.cpp als globale Variable definieren und in einer separaten Headerdatei die Deklaration der Variablen in den Namespace setzen, also z.B. so:

    //quellcode1.cpp
    #include <iostream>
    #include "daten.h"  // Header mit Namespace einbinden
    using namespace std;
    
    int daten::alter;
    void edit_alter(); // Funktion aus zweiter Quellcode Datei
    
    int main()
    {
    cout<< "Gib dein Alter ein: ";
    cin >> daten::alter;
    
    edit_alter();
    cout<< "Nun sind sie "<< daten::alter<< " alt.\n";
    return 0;
    }
    
    // daten.h
    #ifndef DATEN:H
    #define DATEN_H
    
    namespace daten
    {
    extern int alter;
    }
    
    #endif
    
    // quellcode2.cpp
    #include "daten.h"
    
    void edit_alter()
    {
       daten::alter = 20; 
    }
    


  • Erstmal Danke für die Antworten. Also ich werde mich mal mit den Präprozessor Direktiven beschäftigen.

    Aber ich glaube eine Notlösung gefunden zu haben, die bei mir auch funktioniert.

    z.B:
    ------------------source1.cpp------------------------
    #include <iostream>
    using namespace std;

    void funktion(int &wert);

    namespace test
    {
    int wert = 200;
    }

    int main()
    {
    funktion(test::wert);
    cout<< "Wert = "<< test::wert<< endl;
    return 0;
    }

    ------------------source2.cpp------------------------
    void funktion(int &wert)
    {
    wert = 300; // Nun gehts 🙂
    }

    Nun ja, vielleicht nicht DIE Lösung aber so gehts wunderbar. Jetzt braucht halt jede Funktion in einer anderen Quellcode Datei, die auf den Namensbereich "Test" zugreiffen will, einen Parameter mit dem entsprechenden Wert.

    Grüsse


Log in to reply