C++: statische Klasse vs. Namesbereich

benediktibk

Standardgruppe für nicht aktivierte User
#1
Aufgrund der Übersichtlichkeit und dem leichteren Verständnis überlege ich im Moment, ob es besser ist in C++ eine statische Klasse künstlich zu basteln oder einfach nur ein Namesbereich die elegantere Lösung darstellt.
In C# würde sich diese Frage ja nicht stellen, da man dort einfach vor die Klassendefinition static hinzufügt. In C++ müsste man aber selber darauf achten, dieser Klasse nur statische Funktionen hinzufügen. Nachdem es aber auch die Möglichkeit von Namensbereichen gibt, könnte man genauso gut hierin alles zusammengehörige zusammenfassen.
Ziel des Ganzen ist eine möglichst elegante Lösung, und hierzu wäre es nett ein paar Meinungen von euch zu hören.

mfg benediktibk
 
Zuletzt bearbeitet:
#2
Könntest du erklären wozu du deine statische Klasse buntzen willst? Wenn ich dich richtig verstanden habe, willst du wissen ob du lieber

Code:
class MyStaticClass {
static void function1();
static void function2();
}

oder

namespace staticFunc {
void function1();
void function2();
}
benutzen sollst?

IMHO ist es Geschmackssache. Wenn du eine Funktion ohne Objekt benutzen willst, meckert der Compiler, also ist es unmöglich, dass du das static vergisst.

Auf der anderen Seite musst du jedem Funktions-Aufruf ein staticFunc:: voranstellen, da du (oder die Personen die deinen Code wiederverwenden) standardmäßig wahrscheinlich einen anderen Namespace benutzen.
 

benediktibk

Standardgruppe für nicht aktivierte User
#3
Genau das meine ich, nur habe ich eben auch schon gelesen "mach keine klasse wenn sie kein objekt darstellt". Deswegen wollte ich fachlich fundierte Erklärungen. Wenn es keine gibt, werde ich das nach Lust und Laune aus dem Bauch heraus lösen.

mfg benediktibk
 

xblax

Member of Honour
#4
Das ist aber schwachsinn.
Ich würde den objektorientierten Ansatz wählen und alles in eine Klasse packen. In Sprachen wie Java z.B. geht das gar nicht anders.
Hat auch den Vorteil, dass du Hilfemethoden mit in die Klasse aufnehmen kannst, die nach außen hin nicht sichtbar sind.
 

bad_alloc

Member of Honour
#6
Laut Wikipedia geht es bei Namespaces um folgendes:
Der Namensraum (englisch: „namespace“) ist ein Begriff aus der Programmierung. Dabei werden – vor allem bei der objektorientierten Programmierung – die Namen für Objekte in einer Art Baumstruktur angeordnet und über entsprechende Pfadnamen eindeutig angesprochen.
Das heißt, dass du deine kompletten Klassen in namespaces einsortieren solltest. Auto-, Lkw- und Ampelklassen kämen bspw. in den Namespace Straßenverkehr. Einzelne Methoden wie beschleunige() oder geheKaputt() gehören natürlich in die Klasse.
Ein Namespace ist demnach nicht dazu gedacht die Aufgaben einer statischen Klasse (also Funktionssammlung) zu übernehmen, auch wenn er dazu genützt werden könnte. Die statischen Klassen dagegen gehören jedoch dort hinein, damit man nicht unnötig vererben muss.
 

benediktibk

Standardgruppe für nicht aktivierte User
#7
Danke, das ist eine vernünftige Erklärung. Auch wenn ich gestehen muss, dass es mir zuviel Arbeit ist, in meinen Projekten namespaces zu verwenden, nur in diesem Fall kam es mir in den Sinn. Ich bevorzuge für normal endlos lange Namen, dann kann es auch zu keinen Verwechslungen kommen. Und wenn die automatische Codevervollständigung der IDE halbwegs anständig funktioniert, bedeutet diese Methode auch keinen besonders großen Mehraufwand beim Tippen.

mfg benediktibk
 
Oben