frage zu extern mit Klasse (C++ Buch verlegt) [gelöst]



  • ich würde für mein Projekt gerne eine Globale Variable anlegen, auf die ich von allen meinen quelltexten zugreifen kann. Dazu habe ich mir eine main.h angelegt, und dort die Variable mit extern erstellt, allerdings ist sie ja noch nicht existent, ich muss ja noch den Konstruktor in der main.cpp aufrufen, aber wie mache ich das, wenn die variable schon da ist? Leider halten sich die Informationen über "extern" im Internet sehr versteckt.



  • in main.h

    extern variablen_typ globalesVariable;
    

    extern erzeugt keine variablen, daher muss sie irgendwo noch erzeugt werden, bspw in main.cpp

    variablen_typ globalesVariable(irgendwas); //hier wird die variable erzeugt
    //gleiche deklaration verwenden, aber ohne extern und dafür mit dem konstruktorparameter, so du einen brauchst
    

    wobei du den header besser nicht main.h sondern global.h nennen solltest.



  • Krux meint wahrscheinlich, dass er in main.cpp auch noch global/main.hpp einbindet!

    Stimmts? 😉



  • ne ghorst hat schon recht, danke. Bei mir heißt keine Datei *.hpp, noch habe ich Ordner, in denen ich meine Quelltexte verwalte.



  • Thomy schrieb:

    Krux meint wahrscheinlich, dass er in main.cpp auch noch global/main.hpp einbindet!

    und wo wäre das problem?
    die "extern"-deklaration und die normale können problemlos sogar in einer datei stehen.
    aber hier das vollständige bsp für dich:
    main.h:

    #include <string>
    extern std::string test;
    

    main.cpp

    #include <iostream>
    #include <string>
    #include "main.h"	
    std::string test("test");
    
    int main()
    {
    	std::cout << test << std::endl;
    	return 0;
    }
    

    nach dem präprozessor durchlauf, steht die beiden deklarationen in der selben datei. ist aber alles kein problem, da extern nur die existenz des symbols und den datentyp definiert, allerdings es nicht weiß, wo es liegt. die "normale" deklaration definiert wieder die existenz des gleichen symbol und erzeugt die daten. die eigentliche verbindunge zwischen symbol und speicherstelle erfolgt formal erst beim linken. (real werden lokale symbole und ähnliches schon weit früher aufgelöst.)



  • ja ich hab es schon verstanden, ist ja auch nicht das erste mal gewesen, dass ich extern verwendet habe, allerdings hatte ich wieder vergessen, wie ich es benutze. Aber trotz dem nochmal danke.


Anmelden zum Antworten