Zum Inhalt springen

Statische Konstante


SwordMaster

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...