Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Config, aber wie?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.05.2007, 01:01 Uhr
FunnyDingo



Hallo zusammen,

ich brauche für ein Projekt eine Konfigurationsmöglichkeit. Prinzipiell ja nichts ungewöhnliches, aber ich stehe gerade voll auf dem Schlauch, wie ich das am besten lösen könnte. Ich dachte daran, einen Singleton zu erstellen. Aber macht es Sinn, einen Singleton zu nutzen, wenn ich das Ding in meinem ganzen Projekt brauche? Und wie würde ich den Singleton dann am besten "den anderen" Quelldateien zur Verfügung stellen? Reicht es das Header file zu inkluden? Oder muss noch irgendwo ein ein "extern class_config config" rein?

Irgendwie raff ich das, wann man etwas extern machen muss und wann nicht, nicht so ganz :-(

Gruß,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2007, 07:37 Uhr
virtual
Sexiest Bit alive
(Operator)


Fangen wir mal mit dem extern an.

In C/C++ unterscheidet man zwischen Deklaration und Definition.

Eine Deklaration führt einen Namen ein und beschreibt, welche Signatur er hat. Zum Beispiel, ist folgendes eine Funktionsdeklaration:

C++:
void f(int a);


Wenn ein Kompiler eine solche Zeile liest, weiß er, daß der Name "f" eine Funktion ist, welche nix zurückgibt, aber einen int erwartet. Was "f" genau tut, weiß der Kompiler aber noch nicht.

Während eine Deklaration einen Funktionsnamen einführt, ist eine Definition dafür verantwortlich, daß sie beschreibt, was die Funktion tut. Dies hier wäre ein Funktionsdefinition:

C++:
void f(int a) {
   sleep(a*a);
}


Man kann sagen, daß eine Definition stets eine Deklaration ist, nicht jedoch umgekehrt.
AUsserdem kann man - auch wenn das anhand von Funktionen nur recht subtil erkennbar ist - feststellen, daß eine Definition stets Speicher (im Programm) verbraucht, eine Deklaration dagegen nicht: Der Maschinencode vom Funktionskörper von "!f" braucht ja irgendwo Platz im Ausführbaren Programm.

Bisher haben wir ja nur über Funktionen geredet und ausserderm gelernt, daß eine Definition stets auch eine Deklaration ist. Wie vermutlich bekannt ist, ist eine Variablen Definition so was hier:

C++:
int a;


Bedeutet: es gibt einen Speichplatz welcher soviel Platz hat, daß ein int reinpasst und er wird a genannt. (Um es deutlich zu machen: Die Definition belegt also Speicher).
Will man nun deutlich machen, daß es ein "a" gibt, aber es nicht definieren, so muß man es deklarieren. Während man bei Funktionen eine Deklaration von eine Definition leicht dadurch unterscheiden kann, daß bei einer Deklaration der Funktionskörper fortgelassen wird, sieht es bei Variablen so aus, daß wenn da "extern" steht, die dies nur eine Deklaration ist ("extern" heißt also: Die Variable ist irgendwo anders definitiiert).


Generell darf man ein Ding deklararieren so oft man lustig ist (solange sich dir Deklarationen nicht widersprechen). Dagegen gibt es in C eine eiserne "One-Definition-Rule" die Besagt, daß man zu einem Namen nur eine Definition finden darf.

Die Header sollen in C/C++ generell nur Deklaration enthalten. Dies liegt daran, daß Header in verscheidenen Dateien eines Projekts mehrmals inkludiert werden können. Da das Includieren letztlich nichts anderes bedeutet, daß die Includeanweisung verbatim mit dem Headerfile inhalt ersetzt wird, würde eine Definition in einer Includedatei dazu führen, daß es mehrere Konkurrierende Definition eines Namens geben würde.

Für dein Vorhaben ist ein Singleton sicherlich ein korrekter Ansatz.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.05.2007, 11:40 Uhr
FunnyDingo



Das habe ich endlich mal verstanden (glaube ich). Wenn ich es verstanden habe, müsste ich doch folgendes machen können. In meine config.h packe ich folgendes:

C++:
#ifndef CLASS_CONFIG_H
#define CLASS_CONFIG_H

class config_class
{
...
};

#endif // CLASS_CONFIG_H

extern config_class config;


Und in die config.cpp

C++:
#include "config.h"
config_class config;

// Hier folgt die Defintion der Klasse


Dann brauche ich ja nur noch in allen Source-Files die die config brauchen, die config.h zu includen. Dann weiß jede Source-File, wie config_class aussieht und hat auch die Deklaration. Oder müsste die extern-Anweisung noch mit in den #ifndef ... #endif?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.05.2007, 11:50 Uhr
xXx
Devil


hmm

C++:
#if !defined(CONFIG_H__INCLUDED)
#define CONFIG_H__INCLUDED

#if (_MSC_VER > 1000)
    #pragma once
#endif

class config
{
private:
    config();
    ~config();

public:
    static config& instance() { static config inst; return inst; }
};

#endif //
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.05.2007, 12:10 Uhr
FunnyDingo



Hm, das Beispiel von xXx verstehe ich grad nicht
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.05.2007, 12:17 Uhr
FunnyDingo



Korrektur, ich glaube ich habe es doch verstanden. Beispiel

C++:
#include <iostream>
#include "config.h"
config cfg = config::instance();
// Ab hier kann ich dann mit cfg arbeiten, z.B.
std::cout << cfg.getString("PluginPath") << std::endl;

Richtig?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 28.05.2007 um 12:20 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.05.2007, 12:53 Uhr
FunnyDingo



Mein Annahme ist wohl nicht richtig... Er beschwert sich nämlich, dass er den Konstruktor bzw. Destruktor nicht finden kann.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.05.2007, 13:06 Uhr
Blubber2063



Du musst noch die Implementationen der im Header definierten Methoden mit reinschreiben. Sonst gibt das Linkerfehler.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.05.2007, 14:01 Uhr
FunnyDingo



Ja... Bin ich doof *g* Jetzt gehts ;-) Besten dank!
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.05.2007, 14:26 Uhr
xXx
Devil


Und man sollte drauf achten, das er private ist ... dadurch stellst du sicher, dass es wirklich nur eine Instanz gibt.

Öhm wenn du es nicht verstehst ... guck dir mal "Singleton" an ...

Aufruf:

C++:
std::cout << config::instance().getString("PluginPath") << std::endl;
std::cout << config::instance().getString("Language") << std::endl;
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: