Zum Inhalt springen

statische Struktur als Member einer Klasse


Empfohlene Beiträge

Geschrieben

Hallo,

ich wollte mir heute eine Klasse zusammenstellen, die ihre Objekte in einer ini-Datei speichert.

Problem an der Sache ist, dass die Schlüssel (unter den Selections der Ini) erst zur Laufzeit festlegen möchte.

dazu hab ich mir für die spätere Speicherung folgende Struktur definiert:


typedef struct{

	LPTSTR p_lpKeySName;

	LPTSTR p_lpKeyFName;

	LPTSTR p_lpKeyTel;

	LPTSTR p_lpKeySG;

} SFileProperties_t;

Diese ist statisch (für alle Instanzen) als Member der Klasse definiert:

class CUser  

{

public:

	CUser();

	~CUser();

	static void s_p_setFileProperties(const SFileProperties_t &p_sNewFileProperties);


private:

	static SFileProperties_t s_m_seFileProperties;

};

Soweit geht die Deklaration (d.h. sie bringt keinen Fehler) wenn ich jetzt die statische Funktion zum Setzen der (Struktur-) Werte wie folgt definier:

void CUser::s_p_setFileProperties(const SFileProperties_t &p_sNewFileProperties)

{

	strcpy(CUser::s_m_seFileProperties.p_lpKeyFName, p_sNewFileProperties.p_lpKeyFName);

	strcpy(CUser::s_m_seFileProperties.p_lpKeySName, p_sNewFileProperties.p_lpKeySName);

	CUser::s_m_seFileProperties.p_lpKeyTel = p_sNewFileProperties.p_lpKeyTel;

	strcpy(CUser::s_m_seFileProperties.p_lpKeyTel, p_sNewFileProperties.p_lpKeyTel);

}

erhalte ich folgende Fehler:

User.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static struct SFileProperties_t CUser::s_m_seFileProperties" (?s_m_seFileProperties@CUser@@0USFileProperties_t@@A)

Debug/CUser.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

Kann mir wer sagen woran das liegt?

Geschrieben

Ja es reicht nicht den static eintrag in der Klassendefinition anzugeben, dort ist er dann nur deklariert.

Du musst dann noch zusätzlich implementieren:

CUser::SFileProperties_t s_m_seFileProperties;

Ob die Begründung nun so ganz astrein ist bin ich nicht sicher, auf alle fälle mach das in die .cpp rein und gut.

Geschrieben

Konnte gestern nicht mehr on :rolleyes:

Ja, das ging, zumindest kommt kein Fehler mehr...

Ich dachte eigentlich, dass ab der Variablendeklaration diese Verfügbar ist. Aber ich hab vergessen das static ja eine Speicherklasse ist, die auch initialisiert werden muss...

Hätte nicht gedacht, dass das so einfach bei privaten Membern geht :uli

Geschrieben

Ich hoffe, dass du auch irgendwo Speicher holst, auf den diese Zeiger weisen können. Sonst geht das erst strcpy in die Hose.

Damit du dir dieses ganze Speichermanagement schenken kannst, empfehle ich, die Zeiger durch Stringobjekte zu ersetzen.

Geschrieben
Damit du dir dieses ganze Speichermanagement schenken kannst, empfehle ich, die Zeiger durch Stringobjekte zu ersetzen.

String oder CString ?

Ich hatte CString probiert und da kam ein Fehler von wegen Konstrukor in Strukturen (hab den Code leider nicht da, sonst würd ich den kompletten Wortlaut zitieren)

Geschrieben
Hallo,

Abgesehen von deinem Problem, was macht das für einen sinn ??????

Ich will den Anwendern, die das Programm später einsetzen nicht zumuten personenbezogene Daten immer neu eingeben zu müssen. Ini-Dateien schienen mir am besten für das Auslesen und Eintragen der Werte.

Und die Struktur halt, damit man später mehrere Dateien verwalten kann.

Geschrieben
Ich will den Anwendern, die das Programm später einsetzen nicht zumuten personenbezogene Daten immer neu eingeben zu müssen.

ach so

Ini-Dateien schienen mir am besten für das Auslesen und Eintragen der Werte.

eine ganz normale Text-Datei wurde ausreichen

Geschrieben

eine ganz normale Text-Datei wurde ausreichen

Mir doch egal... ini-Dateien sind im Endeffekt auch nur Textdateien (nur halt mit der Endung .ini)

Es ging mir mehr um den Aufbau der Datei und das ist nunmal unter Windows ini-ähnlich:


[Selection]

Key1=Value1

Key2=Value2

Key3=Value3

...

Dateitypen interessieren mich herzlich wenig :P

Wichtig ist nur, dass ich die mit meinem Programm lesen kann. :marine

Geschrieben

static bedeutet, dass du auf die Variable ohne Instanziierung zugreifen kannst.

Normal wird ja über Objekt.Attribut eine Variable (oder Methode) angesprochen

Bei static wär das Class::Variable (/Methode)

Edit:

Eine statische Variable gilt für alle Instanzen dieser Klasse.

Geschrieben
static bedeutet, dass du auf die Variable ohne Instanziierung zugreifen kannst.

Eine statische Variable gilt für alle Instanzen dieser Klasse.

:P

Eine Klassenvariable wird nicht für jedes Objekt neu angelegt - spart also Speicher. Außerdem können die Objekte selber diese verändern. Meinetwegen um einen Counter hochzuzählen

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...