SwordMaster Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 Hallo Leute, ich hab schon länger nicht mehr C++ Programmiert, und jetzt stell ich fest dass man inerhalb ein paar monaten schon sehr viel vergisst! ich versuche jetzt schon länger eine statische Konstante vom typ char * anzulegen! aber irgendwie kriege ich es nicht hin. class CTest { public: CTest(); virtual ~CTest(); static const char* m_text ; }; dass nimmt der Kompiler noch, aber wie kann ich m_text dann im Konstruktur zugreifen? kann ich eine constante im Konstruktur überhaupt noch zuweisen? ich habs mit folgendem Konstruktur probiert CTest::CTest() { CTest::text = new char[100]; } aber der kompiler sagt nur immer: "Nichtaufgeloestes externes Symbol..." selbst wenn ich das "const" weglasse kann ich auf die variable nicht mehr zugreifen? kann mir jemand helfen?? Danke SwordMaster Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 Ich bin zwar in C/C++ nicht so bewandert, doch das OOP-Konzept sollte sich ja nicht gravierend von dem in Java unterscheiden. Ist der Sinn einer Klassenkonstante nicht verwirkt, wenn ich sie bei Objekterzeugungen ändere? Zum ersten weil es eine Konstante ist, zum zweiten, weil sie eine Klassenvariable ist? Wenn Du wirklich eine Variable beim Erzeugen eines Objektes spezifisch belegen willst, ist doch eine Objektvariable (oder Konstante) die bessere Alternative. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 Also so wie ich das sehe muss der Fehler woanders liegen. Ist wirklich die Variable das nicht aufgelöste Symbol? Folgendes Funktioniert ohne Probleme: class test { public: test() { test::i = new char; } static char *i; }; [/PHP] Achso: Const macht an der Stelle keinen Sinn, weil du ja erst im Konstruktor was zuweisen willst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 Konstante Member kann man nur in der Initalisierungsliste des Konstruktors initialisieren. Aber ich gebe Newlukai recht: Warum static? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SwordMaster Geschrieben 20. Februar 2005 Autor Teilen Geschrieben 20. Februar 2005 Danke für deine Antwort. Dein Quellcode funktioniert tatsächlich.... aber soblad ich die deklaration in einer .h datei habe und die implementierung in einer *.cpp (also so wie mir VC++) die klassen erstellt funktioniert es nciht mehr ich bekomme folgenden Fehler: "Kompilierung läuft... StdAfx.cpp Kompilierung läuft... temp4.cpp temp4Dlg.cpp Test.cpp Generieren von Code... Linker-Vorgang läuft... Test.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static char * CTest::i" (?i@CTest@@2PADA) Debug/temp4.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise Fehler beim Ausführen von link.exe. temp4.exe - 2 Fehler, 0 Warnung(en)" zu der Constante: Es müßte aus dem Grund eine Konstante sein, weil die klassen von außen nur den wert lesen dürfen, aber NICHT VERÄNDERN.... weißt du wie ich eine Konstante machen kann? wenn ich den Wert der konstante dann woanders festlegen muss und nicht im konstruktur ist mir das egal! evtl kannst du mir nochmal helfen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SwordMaster Geschrieben 20. Februar 2005 Autor Teilen Geschrieben 20. Februar 2005 also static bräuchte ich weil ich die konstante auch in anderen klassen brauche (wo ich KEINE INSTANZ meiner klasse besitze) wo genau ist diese "initialisierungsliste" des konstruktos? wo man constanten festlegen kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 also static bräuchte ich weil ich die konstante auch in anderen klassen brauche (wo ich KEINE INSTANZ meiner klasse besitze) Dir ist aber klar, dass es dann möglicherweise zu spät sein kann, wenn du die Konstante erst dann initialisierst, wenn eine Instanz angelegt wird? wo genau ist diese "initialisierungsliste" des konstruktos? wo man constanten festlegen kann?Die Initialisierungsliste ist nur für Instanzvariablen (also nicht static) sinnvoll. Du würdest die Variable ja bei jeder Instanzierung von CTest überschreiben. Du brauchst einfach nur eine Definition der statischen Variablen. Bisher hast du nur eine Deklaration. Das ist auch der Grund, warum sich der Linker beschwert. Definier also in einer cpp-Datei, außerhalb von allen Funktionen, deine Variable. Dabei kannst du sie dann auch gleich initialisieren: const char* CTest::m_text(new char[100]); Warum eigentlich new? Wenn die Größe feststeht, könntest du doch auch ein statisches Array benutzen, oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 zu der Constante: Es müßte aus dem Grund eine Konstante sein, weil die klassen von außen nur den wert lesen dürfen, aber NICHT VERÄNDERN....Dazu noch etwas: Du hast bisher nur einen (nicht konstanten) Zeiger auf konstante Zeichen. Damit lässt sich der Zeiger selbst immer noch verändern. Wenn der Zeiger selbst auch konstant sein soll, brauchst du const char* [b]const[/b] m_text; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 20. Februar 2005 Teilen Geschrieben 20. Februar 2005 Hallo Leute, class CTest { public: CTest(); virtual ~CTest(); static const char* m_text ; }; [/PHP] [PHP] CTest::CTest() { CTest::text = new char[100]; } aber der kompiler sagt nur immer: "Nichtaufgeloestes externes Symbol..." Es muss mindestens CTest::m_text = new char[100]; [/PHP] heißen. Die Konstruktion halte ich allerdings trotzdem für fragwürdig. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SwordMaster Geschrieben 20. Februar 2005 Autor Teilen Geschrieben 20. Februar 2005 danke für eure schnellen antworten! ich werds morgen gleich nochmal versuchen!! vielen dank nochmal! Ciao swordmaster Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.