2010-03-05 5 views

Antwort

12

Ich würde einen Namensraum für globale Konstanten verwenden, die nicht sehr stark mit einer einzigen Klasse zugeordnet. Im letzteren Fall würde ich sie in diese Klasse aufnehmen.

Wirklich globale (Anwendungsebene) Konstanten sollten im Namespace der Anwendung sein (vorausgesetzt, Ihre Anwendung befindet sich in ihrem eigenen Namespace, wie es sein sollte). Für Konstanten auf Modulebene ist der eigene Namensraum des Moduls der natürliche Ort.

+0

+1, aber für Modulebene Konstanten, die die Klassendeklaration nicht sichtbar sein müssen, verwende ich eine anonomyous namspace. –

+0

@ T.E.D. Hängt davon ab, was dein "Modul" ist - ich habe über eine größere Einheit nachgedacht, die aus mehreren Klassen besteht. Wenn Sie mit "Modul" eine einzelne Kompilierungseinheit meinen, stimme ich Ihnen vollkommen zu. –

4

Der beste Ansatz ist es, sich in den gleichen Namensraum zu platzieren, wo sie hingehören. Eine große C++ - Anwendung wird in der Regel viele Module mit jeweils eigenen Konstanten haben. Jedes Modul sollte sich in einem Namensraum befinden, in dem sich auch seine Konstanten befinden.

0

Eine Möglichkeit ist, sie in eine Klasse, die als nicht-statische Elemente setzen und ein Objekt dieser Art in Ihrer Funktion main() setzen. Das vereinfacht es, sie nicht-globals zu machen wenn Sie herausfinden, dass Sie, aus welchem ​​Grund auch immer, müssen.

1

Als einfache Faustregel gilt: Ich habe sie in welchem ​​Ort Ergebnisse in ihnen keine Präfixe irritierend C-Stil.

So zum Beispiel, wenn Ihre Konstanten genannt werden mylib_foo, mylib_bar, dann sollten sie im Namensraum mylib sein und mylib::foo und mylib::bar sein.

Wenn Namespace mylib enthält Konstanten circle_max_radius, sphere_max_radius, rectangle_max_width, rectangle_max_height, wo Kreis, Kugel und Rechteck-Klassen sind, dann sollten sie die Teilnehmer statisch.

max ist kein „irritierend“ Präfix, es ist ein ziemlich vernünftig, da es eine beschreibende Modifikator ist eher als ein besitzergreifend („max Radius ein Kreis“). So kann es bleiben.

1

Eine Möglichkeit ist ues eine Klasse mit statischen Member-Funktionen, die die Konstanten zurück. Ich benutze das, wenn ich Konstanten brauche, die mehr sind als einfache Typen oder einfache Objekte.

class Constant 
{ 
public: 
    static const ComplexObject& getComplexObject() 
    { 
      static ComplexObject constObj = createComplexObject(); 
      return constObj; 
    } 
private: 
    static ComplexObject createComplexObject() 
    { 
     ComplexObject obj; 
     obj.setValue(1); 
     return obj; 
    } 
} 
2

Für Konstanten lokalen zu einer einzigen CPP-Datei, der beste Ansatz ist es, sie in einem anonymen Namespace zu erklären, wie so:

namespace { 
    int const seconds_per_minute = 60; 
    int const minutes_per_hour = 60; 
} 

Für Konstanten, die sichtbar für das gesamte Programm sein müssen, Die einfachste Lösung besteht darin, für sie einen (named) namespace zu erstellen und diesen in eine Header-Datei einzufügen.

Wenn es einige Operationen gibt (oder sein könnte), sollten Sie stattdessen eine singleton class für sie erstellen. Zum Beispiel ist es ziemlich üblich, dass meine Programme eine Singleton-Klasse namens "configuration" haben, die Start-Konstanten (Dinge wie IP-Adressen und Dinge, die ich nicht wirklich hartcodieren möchte) aus einer Konfigurationsdatei oder der Registry liest so wie das.