Namespace und ihre Auswirkungen



  • Grüße in die Runde !

    ich sitz gerade an einem kleinen Übungsbeispiel aus einem Programierbuch zum Thema Namespaces und hänge jetzt hier:

    namespace test { 
    		//using namespace std; 
    		enum colors { rot, blau, gruen, schwarz }; 
    		int n; 
    		namespace alpha { 
    			double x = 1.05; 
    		} 
    	} 
    
    	namespace beta { 
    		using namespace test::alpha; 
    		double f(int, double); 
    	} 
    
    	namespace test { 
    		const int m = 0; 
    	} 
    
    	int main() { 
    		using namespace test::alpha; 
    		using namespace test;
    		x = 12.5; 
    		n = 1; 
    		cout << rot << endl; 
    		alpha::x(3, 2.0); 
    		n = 2; 
    		x = 2.02; 
    		beta::f(n, x); 
    		beta::f(m, x); 
    		using namespace beta; 
    		f(n, x); 
    		return 0; 
    	}
    

    Ich bekomme aber immer die Fehlermeldung:

    C:\test2.cpp(30) : error C2064: Ausdruck ergibt keine Funktion
    Zeile 30 ist die: alpha::x(3, 2.0);

    und beim Linken:

    Nichtaufgeloestes externes Symbol "double __cdecl beta::f(int,double)" (?f@beta@@YANHN@Z)

    Das verwirrt und beschäftigt mich irgendwie

    😞 😉



  • Das mit dem alpha::x(/.../) ist ein Fehler. Da x ja keine Funktion ist, sondern eine Variable.

    Das du beim Linken ein Fehler erhälst liegt daran, da du beta::f nur deklarierst, aber nicht implementierst.



  • Also ich würde mal sagen:

    DerWurm schrieb:

    C:\test2.cpp(30) : error C2064: Ausdruck ergibt keine Funktion
    Zeile 30 ist die: alpha::x(3, 2.0);

    Das ist richtig, denn alpha::x ist

    namespace alpha
    {
        double x = 1.05;
    }
    

    Also eine double-Variable und keine Funktion.

    DerWurm schrieb:

    Nichtaufgeloestes externes Symbol "double __cdecl beta::f(int,double)" (?f@beta@@YANHN@Z)

    Das ist auch richtig, denn wo wird double f(int, double); definiert??

    Nirgendwo. Deswegen kann der Linker das auch nicht finden.

    Alles in allem liegen die Fehler also nicht in den Namespaces sondern anderswo.

    Ich hoffe, ich konnte dir helfen.

    Felix

    EDIT: Bisschen zu spät 🤡



  • Ich weiß gar ned ob ich das richtig verstehe, aber diese Namespaces haben hier doch nur den einen Sinn - und zwar die Variablen solange zu verstecken bis ich sie benötige, oder ??

    ich hab mir mal rausgeschrieben was das programm meiner meinung nach macht - vielleicht kann mich ja jemand verbessern / ergänzen 😃

    int main() { 
    		using namespace test::alpha; 
    		using namespace test;
    

    Das Programm lädt hier die beiden Namespaces und ich hab ab hier Zugriff auf die Membervariablen und -Methoden

    x = 12.5; 
    		n = 1; 
    		cout << rot << endl;
    

    Da der Test-Namespace schon geladen ist, kann ich mir "rot" ausgeben lassen

    //alpha::x(3,2.0); 
    		n = 2; 
    		x = 2.02;
    

    alpha::x macht ja hier überhaupt keinen sinn, oder ?
    kann man das irgendwie so erweitern dass es was bringtn ??

    beta::f(n, x); 
    		beta::f(m, x);
    

    Ich weiß leider nicht was die Methode f überhaupt macht !?
    Ist das eine Methode ? was bringt die ? was liefert die zurück ?

    using namespace beta; 
    		f(n, x); 
    		return 0; 
    	}
    


  • @Phoemuex

    Danke, da haben sich während meiner Schriftführung schon einige Probleme gelöst :):)

    jetzt stehe ich nur noch vor einem:

    namespace beta { 
            using namespace test::alpha; 
            double f(int, double); 
        }
    

    wie kann ich diese Methode sinnvoll ausprogrammieren ?
    ist das irgendeine besondere Schreibweise bei der Benutzung von Namespaces ?
    oder stimmt das so überhaupt nicht...

    ich würde das Problem halt so lösen:

    namespace beta { 
            using namespace test::alpha; 
            double f(int x, double y){
                   return x+y;
            }
        }
    

    oder ist das totaler Blödsinn ?

    Danke nochaml für die ganze Hilfe !!!!


Log in to reply