Wo sollten man structs definieren?
-
Servus,
ich brauche eine Hilfsdatenstruktur - ich wollte struct nehmen. Wo sollte ich die Struktur dann anlegen. Gebraucht wird diese nur in einer Methode also in der Datei myclass.cpp. Soll ich diese dann in die Methode, in die Klassendatei, in die zugehörige Header-Datei schreiben oder etwa direkt pro struct eine eigene Datei nehmen?
Danke vorab.
-
Hi,
Finde ich persönlich erstmal ziemlich egal. Wenn Du sie später wiederverwenden willst, wäre eine Headerdatei natürlich äußerst sinnvoll. Wenn du sicher bist, sie nur in der Datei zu verwenden, kannst Du sie einfach in der Datei definieren und verwenden. Ich sehe nicht, was dagegen spricht.
-
... also direkt in der Methode in der sie gebraucht werden?
-
Jay1980 schrieb:
... also direkt in der Methode in der sie gebraucht werden?
nein!
-
__-- schrieb:
Jay1980 schrieb:
... also direkt in der Methode in der sie gebraucht werden?
nein!
Warum nicht? Wenn die Struktur nur dort gebraucht wird. Warum auch nicht? Vor allem bei so Sachen, wie Funktoren ist das gar nicht zu verachten. Entspricht ja dann sozusagen einer anonymen Funktion.
-
Eisflamme schrieb:
Wenn Du sie später wiederverwenden willst, wäre eine Headerdatei natürlich äußerst sinnvoll.
Das sehe ich GANZ anders, ich halte diese Art von Denken für schädlich/gefährlich.
Das ist so wie "eine abgeleitete Klasse *könnte* diese Funktion brauchen, machen wir sie protected statt private".
Das führt dazu, dass man die Kapselung unnötig aufbricht, und die Komplexität eines Projekts unnötig steigt.Bei Dingen die in Header-Files deklariert/definiert werden, obwohl sie nur in einem .cpp File benötigt werden ist es ähnlich: es wird alles unübersichtlicher, und Refactoring wird erschwert, weil man länger braucht um sicherzustellen dass man alle Stellen gefunden hat, die eine Funktion/Klasse/Struct verwenden.
(Wenn etwas direkt im .cpp File in einem nameless namespace steht, weiss man sofort, dass es ausserhalb nicht verwendet werden *kann*)Ich finde es viel besser einfach mal alles private zu machen bzw. eben in nameless namespaces in .cpp Files zu packen.
Braucht man es später wirklich an mehreren Stellen, kann man es ja ohne grösseren Aufwand protected/public machen bzw. vom .cpp File in ein Header-File verschieben.Auch spart es Implemeniterungs-Zeit, denn bei etwas was ich in einem nameless namespace packe zerbrech ich mir nicht so lange den Kopf darüber wie das Interface idealerweise aussehen sollte etc., als wenn es öffentlich ist.
Zu dem Zeitpunkt wo man es dann "public" macht (in ein Header-File verschiebt), weiss man meist schon mehr über die dynamik des entsprechenden Code-Abschnitts. Zu dem Zeitpunkt kann man dadurch meist schnell beurteilen, ob das so wie man's erstmal auf die Schnelle gemacht hat auch gut ist, und falls nicht auch meist schnell anpassen.
-
Der Google Translator spuckt für hustbaer's Post folgenden Code aus
:// myclass.cpp namespace { struct theStruct { // ... }; } // ... // deine funktion, die sich auf das struct bezieht
-
drakon schrieb:
__-- schrieb:
Jay1980 schrieb:
... also direkt in der Methode in der sie gebraucht werden?
nein!
Warum nicht? Wenn die Struktur nur dort gebraucht wird. Warum auch nicht? Vor allem bei so Sachen, wie Funktoren ist das gar nicht zu verachten. Entspricht ja dann sozusagen einer anonymen Funktion.
Du kannst nur solche "Funktions-lokale Typen" nicht als Template-Parameter verwenden. Das verbietet Dir der C++03 Standard und ist erst ab C++0x erlaubt, wo dies auch für Lambdas ausgenutzt wird.
-
Nagut.
-
krümelkacker schrieb:
drakon schrieb:
__-- schrieb:
Jay1980 schrieb:
... also direkt in der Methode in der sie gebraucht werden?
nein!
Warum nicht? Wenn die Struktur nur dort gebraucht wird. Warum auch nicht? Vor allem bei so Sachen, wie Funktoren ist das gar nicht zu verachten. Entspricht ja dann sozusagen einer anonymen Funktion.
Du kannst nur solche "Funktions-lokale Typen" nicht als Template-Parameter verwenden. Das verbietet Dir der C++03 Standard und ist erst ab C++0x erlaubt, wo dies auch für Lambdas ausgenutzt wird.
Stimmt. Habe ich ganz vergessen. Man kann sie aber auch sonst nutzen.