2011-01-10 9 views
2

Meine Klasse hat viele Konstruktoren und es gibt viel zu tun im Konstruktor, also dachte ich daran, eine private construct() -Funktion zu machen, um die Wiederverwendung von Code zu fördern. Ist das eine gute Idee? Weil ich viele Bibliotheken sehe, die das nicht tun und Code duplizieren.ist es richtig, eine Konstruktionsfunktion zu haben?

Dank

+3

Seien Sie jedoch vorsichtig, wenn Sie virtuelle Funktionen vom Konstruktor aufrufen. Es verhält sich möglicherweise nicht wie erwartet. Die aufgerufene Version wird diejenige sein, die zu der Klasse gehört, deren Konstruktor gerade aufgerufen wird, und nicht diejenige, die zu dem gehört, was tatsächlich erzeugt wird. – Dawson

+0

Was ist der Grund, dass Sie viele Konstruktoren haben? Was sind die Unterschiede zwischen den Konstruktoren? –

+0

@Alf P. Steinbach Sie sind sehr klein, Dinge wie eine Schnur, nur Dinge, um Bequemlichkeit hinzuzufügen – jmasterx

Antwort

3

Das ist völlig in Ordnung und ist wahrscheinlich eine gute Idee. Was könnte daran liegen, so viele Konstruktoren zu haben. Aber es ist unmöglich zu sagen.

+0

Stellen Sie sicher, es ist keine virtuelle Funktion, es sei denn, Sie sind in Auto-Sodomie. –

1

Werfen Sie einen Blick auf this question, die das Problem in allgemeiner Weise anspricht.

1

Solange construct nicht virtuell ist, ist es im Allgemeinen sicher. Ich bevorzuge es jedoch, in die andere Richtung zu gehen.

Stellen Sie so wenig allgemeine Konstruktoren wie möglich her, und wenn ich viele einfachere Construction-Funktionen benötige, verwende ich freie (Nicht-Member-) Funktionen, die den Konstruktor aufrufen und die fehlenden Parameter mit geeigneten ergänzen Standardwerte und geben Sie dann das konstruierte Objekt zurück.

Auf diese Weise vermeide ich das etwas zweifelhafte Problem von Konstruktoren, die Memberfunktionen des noch nicht konstruierten Objekts aufrufen, und ich vermeide es, Code in der Klasse zu duplizieren.

+0

Wenn die Convenience-Funktionen statische Member sind, können sie auch auf die Innereien des Objekts zugreifen und eine Initialisierung ausführen, die über den Konstruktor hinausgeht. – Nate

+0

Ja, aber was ist der Sinn? Wenn Sie * mehr * als das tun müssen, was der Konstruktor erlaubt, würde ich sagen, es stinkt nach schlechtem Design. Und warum sollte mehr Code in die Klasse gezogen werden? Ich bevorzuge überschaubare Klassen, die sich auf eine Verantwortung konzentrieren. Und 14 verschiedene Komfortfunktionen zum Instanziieren der Klasse verwässern normalerweise diese Verantwortung und fügen * viel * Unordnung * hinzu, wenn sie in der Klasse definiert sind. – jalf

Verwandte Themen