Variabeln in der ganzen Programmlaufzeit

fish-guts

Erfahrenes Mitglied
Hi Zusammen

Ich habe das Problem, dass ich in einer Funktion einen Satz Variabeln definieren möchte, deren Werte zur ganzen Programmlaufzeit gespeichert werden. Nun habe ich folgende Klasse definiert:

Code:
#include <iostream>
#include <cstdlib>
#include <string>
#include "confuse.h"

class Config
{
private:
    int s_port;
public:
    int load(const char* file);
    int get_s_port(void) { return s_port; }
};
Nun wird in folgender Funktion der Variabeln
Code:
s_port
ein Wert zugewiesen:
Code:
int Config::load(const char* file)
{
        general = cfg_getsec(services,"general");
        if(general)
        {
            s_port = cfg_getint(general,"port");
        }
}
Die Zuweisung funktioniert auch problemlos. Wenn ich den Wert von s_port in der selben Funktion ausgeben lasse, wird der korrekte Wert angezeigt.

Nun möchte ich aber folgendes: Ich habe eine Klasse "Sockets" definiert:

Code:
class Sockets
{
public:
    Sockets(void);       
    int connect_services(int port,char *server);
    int Sockets::open(void);
public:
    ~Sockets(void); 
};
Nun möchte ich mit folgender Funktion den Wert von s_port (siehe oben) zurückgeben lassen:

Code:
int Sockets::connect_services(int port,char *server)
{
    class Config conf
    port = conf.get_s_port();
    cout << port << endl;
}
Wenn ich die Variable in der Klasse definiere, kommt dabei nur Unsinn raus. Daher wollte ich die Variable als static definieren, damit der Wert wärhend der Programmlaufzeit erhalten bleibt. Das geht aber nicht, weil dann der Linker einen Error zurückmeldet.

Wenn ich die Variable nun ausserhalb der Klasse als globale Variable mit static definiere, wird alles korrekt kompiliert, get_s_port() gibt aber immer 0 zurück.

Kann mir jemand sagen, was ich genau falsch gemacht habe?
 
Hi,

du musst schon deine Loadmethode aufrufen:
Code:
int Sockets::connect_services(int port,char *server)
{
    class Config conf // hier instanzierst du ein neues objekt von der Klasse Config (das class kannst du weglassen)
    // hier load Methode aufrufen von conf.load(...)
    port = conf.get_s_port(); // hier lässt du dir den Wert zurück geben, der aber weder gesetzt ist noch inizialisiert ist.
    cout << port << endl;
}

Deine Klasse Config sollte einen default Konstruktor haben, in dem du s_port auf 0 (Null) setzt.

Optional kannst du aus deiner Klasse Config ein Singelton machen und dann eine statische globale Funktion in deiner Applikation erstellen, die dir das Config Objekt zurückliefert.
 
// EDIT: Es hat sich erledigt. Ich habe nun die Variabel ausserhalb der Klasse initialisiert und nun funktioniert es. Danke für eure Hilfe!

Hi

Die load() Methode wird in main() aufgerufen.

Code:
int main(int argc, char *argv[])
{
    int ret;
    class services serv;
    serv.welcome();
    if((ret=serv.loadconfig())!=0)
    {
        std::cout << "\n\nexiting..." << std::endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        serv.put("Starting Services...");
        serv.load();
    }
}

Ich habe nun folgendermassen einen Konstruktor erstellt:

Code:
Config::Config()
{
    s_port = 0;
}

Aber ich kann die Variable immer noch nicht als static definieren, weil der Linker dann einen Fehler meldet. Und wenn ich sie normal mit dem Konstruktor initialisiere, gibt s_get_port() immer noch nur 0 zurück...
 
Zuletzt bearbeitet:
Hallo,

static-Variablen müssen außerhalb der Klassenmethoden in der cpp initialisiert werden:
C++:
int Config::s_port = 0;
Gruß
MCoder
 
Hallo

Sorry, da kann ich dir nicht ganz folgen. in C habe ich solche Fälle einfach immer mit globalen Variabeln gelöst, aber in C++ scheint das nicht so einfach zu sein.

Muss ich nun die Variabel s_port in der Klasse definieren und in der Funktion ausserhalb der Klasse initialisieren?

Gruss

FG
 
Hast du es nun hinbekommen ? (wegen deinem EDIT da oben)
Falls nicht dann lass dir gesagt sein, dass die statische Eigenschaft innerhalb der Klasse deklariert werden muss und die Wertzuweisung außerhalb der Klasse, da sie nur einmal für alle objekte dieser Klasse existiert.

C++:
class Test 
{
  static int s_port;  // statische Eigenschaft ohne Zuweisung 
}
int Test::s_port = 0;  // Zuweisung Standard

Soweit ich weiß wird diese automatisch mit 0 initialisiert !?
Theoretisch kann man sich das also schenken außer man initialisert mit einem anderen Wert.

mfg
 
Zurück