Komplexe Konstruktor-Frage
-
Hallo!
Ich habe eine eigene String-Klasse "String" geschrieben. Diese akzeptiert im Konstruktor einen char*. Wenn nun eine Funktion eine Instanz meiner eigenen "String"-Klasse erwartet, dann kann ich auch einen normalen char* übergeben, weil automatisch eine Instanz von "String" angelegt wird (da diese eben einen char* akzeptiert).
Ich habe weiters eine Klasse "File" für den Dateizugriff geschrieben. Diese verlangt im Konstruktor einen "String", der den Dateinamen angibt.
Wenn nun eine Funktion ein "File" erwartet, dann kann ich dort ja auch einen "String" übergeben, da dann automatisch ein "File" erzeugt wird.
Jetzt kommt es aber: ich wollte nun an eine Funktion, die ein "File" erwartet, einen char* übergeben. Ich war der Meinung dass er automatisch den char* an den Konstruktor von "String" übergibt und im Anschluss das "String"-Objekt an den Konstruktor von "File" übergibt um das geforderte "File"-Objekt zu erzeugen.
Tut er aber nicht. Es kompiliert nicht weil nicht nicht casten kann. Geht diese "Trick" etwa nur über eine Stufe?
Ist das normal?
Danke!
mfg
-
ChrisR schrieb:
Geht diese "Trick" etwa nur über eine Stufe?
Ja.
Ich halte es übrigens für keine gute Idee, anstelle eines Files einen String übergeben zu können. Ich würde den File-Konstruktor explicit deklarieren, damit das nicht geht.
-
wenn du ne funktion
foo(File x); hast und gibts dort foo("test.txt") an, dann guckt der Compiler nach ob File einen Konstrukor der Form File(const char*) hat - wenn nicht -> fehler - geht also nicht über 2 "Schichten" - das würde zum verstädniss des codes nicht besonders beitragen
-
ChrisR schrieb:
Tut er aber nicht. Es kompiliert nicht weil nicht nicht casten kann. Geht diese "Trick" etwa nur über eine Stufe?
Ja, das ist im ANSI-Standard so festgelegt - nur EINE user-definierte Typumwandlung (Umwandlungs-Konstruktor bzw. -Operator) ist erlaubt.