Hallo zusammen,
ist es möglich unter C++ vom Konstruktor einen Rückgabewert zu bekommen?
Man kann bei beim Instanziieren ja Argumente an den Konstruktor
übergeben, warum also nicht auch einen Pointer und so mittels Call by
Reference einen Rückgabewert "durch die Hintertür" erreichen?
viele Grüße!
Natürlich kann man einen Pointer übergeben und der Konstruktor schreibt
da was rein. Und dann? Das ist aber kein Rückgabewert.
Dass es pfuschig und unübersichtlich (weil gänzlich unerwartet) ist,
muss ich wohl gar nicht erst erwähnen.
Mr. T schrieb:> Hallo zusammen,>> ist es möglich unter C++ vom Konstruktor einen Rückgabewert zu bekommen?> Man kann bei beim Instanziieren ja Argumente an den Konstruktor> übergeben, warum also nicht auch einen Pointer und so mittels Call by> Reference einen Rückgabewert "durch die Hintertür" erreichen?
Nichts und niemand hindert dich daran, das zu tun. Wie sinnvoll es ist,
musst du entscheiden. Dem Compiler ist das egal, solange du dich im
Rahmen der Sprachregeln bewegst.
Aber einen Returnwert, so wie bei normalen Funktionen, gibt es bei einem
Konstruktor nicht.
Manchmal ist es halt nötig (z.B. wenn man keine Exceptions nehmen kann,
und im ctor etwas schief gehen kann).
Eine Alternative zu einem übergebenen Pointer oder Referenz zur
Rückmeldung wäre noch ein interner Status, der je nach Erfolg des ctor
gesetzt wird (evtl. auch von anderen Methoden später) und mit einer
getStatus() o.ä. abgefragt werden kann.
PS: das hat dann eine gewisse Ählichkeit zu errno, nur halt ein Exemplar
pro Objekt.
Klaus Wachtler schrieb:> Manchmal ist es halt nötig (z.B. wenn man keine Exceptions nehmen kann,> und im ctor etwas schief gehen kann).
schon klar, aber wie sollte man es dann aufrufen?
Cx x(param)
wie würde man dann jetzt den Returnwert abfragen wollen?
Peter II schrieb:> Klaus Wachtler schrieb:>> Manchmal ist es halt nötig (z.B. wenn man keine Exceptions nehmen kann,>> und im ctor etwas schief gehen kann).>> schon klar, aber wie sollte man es dann aufrufen?>>> Cx x(param)>> wie würde man dann jetzt den Returnwert abfragen wollen?
Peter, oben beschreibt doch der TE dass er es über einen Pointer lösen
will. Natürlich hat ein Konstruktor keinen Rückgabewert.
cyblord ---- schrieb:> Peter, oben beschreibt doch der TE dass er es über einen Pointer lösen> will.
nein, er will es nicht über den Umweg Parameter lösen
Peter II schrieb:> cyblord ---- schrieb:>> Peter, oben beschreibt doch der TE dass er es über einen Pointer lösen>> will.> nein, er will es nicht über den Umweg Parameter lösen
Er schreibt aber genau das hier:
> Man kann bei beim Instanziieren ja Argumente an den Konstruktor> übergeben, warum also nicht auch einen Pointer und so mittels Call by> Reference einen Rückgabewert "durch die Hintertür" erreichen?
Karl Heinz schrieb:> Nichts und niemand hindert dich daran, das zu tun. Wie sinnvoll es ist,> musst du entscheiden. Dem Compiler ist das egal, solange du dich im> Rahmen der Sprachregeln bewegst.
Dem ist doch nichts weiter hinzuzufügen.
Oliver
In vielerlei Hinsicht ist ein Konstruktor eine ganz einfache Funktion.
Natürlich kannst Du der auch einen Zeiger oder eine Adressreferenz
mitgeben.
Mir stellt sich dabei aber die einfache Frage: Was soll's?
Was hindert Dich daran das Ergebnis in der Klasse zu speichern und über:
Klassenreferenz.Rueckgabewert zu ermitteln?
Bastler schrieb:> Wobei der Compiler auch einfach mal einen Default- und/oder> Copy-Konstruktor bei Bedarf selbst anlegt.
Nur, wenn er darf. Wenn nicht, dann nicht...
Oliver
Dr. Sommer schrieb:> Alternative: Eine "optional" Klasse verwenden (wie zB Boost.Optional,> kann man sich auch leicht selber bauen) und eine Factory-Funktion:
schöner wäre eine imho eine statische Memberfunktion. Da entfällt auch
die leidliche friend-Deklaration.
1
classMyClass{
2
public:
3
voiddoSomething();
4
5
staticoptional<MyClass>create(inta,intb,intc)
6
{
7
// Parameter gültig?
8
if(a<42&&b<c){
9
// Instanz erstellen und zurückgeben
10
returnoptional<MyClass>(MyClass{a,b,c});
11
}
12
// Parameter ungültig => Nichts zurückgeben
13
return;
14
}
15
16
private:
17
// Konstruktor privat; somit können nur über die Factory-Funktion Instanzen erstellt werden.
18
MyClass(inta,intb,intc);
19
};
20
21
intmain(){
22
// Factory aufrufen zum Instanz erstellen...
23
autox=MyClass::create(1,2,3);
24
// Instanz erstellt?
25
if(x)
26
x->doSomething();
27
else
28
std::cout<<"Fehler beim Anlegen der Instanz von MyClass.\n";
Vlad Tepesch schrieb:> schöner wäre eine imho eine statische Memberfunktion.
Ob schöner ist Ansichtssache. Die Factory-Funktionen in der Standard
Library sind auch keine Member-Funktionen (std::make_shared zB).
Dr. Sommer schrieb:> Alternative: Eine "optional" Klasse verwenden
Wie verbreitet ist das? Eine Doku sagt: "After reviewing national body
comments to N3690, this library component was voted out from C++14
working paper into a separate Technical Specification. It is not a part
of the draft C++14 as of n3797."
A. K. schrieb:> Wie verbreitet ist das? Eine Doku sagt: "After reviewing national body> comments to N3690, this library component was voted out from C++14> working paper into a separate Technical Specification.
Ja, total bescheuert. Boost.Optional kann man aber immer
nachinstallieren oder es eben selber implementieren.