C++ - Problem mit Weglassen parameterlosem Konstruktor

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1973
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi » 06.04.2016 11:32:25

Es gibt viele Foren und eine Welt ausserhalb

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von eggy » 06.04.2016 18:07:29

Da der Code nicht vollständig zu sein scheint, geraten:
Du hast zwar im .h beide Konstruktoren angegeben, im .cpp den entsprechenden Code-Teil jedoch nur einmal?
Jetzt wärs ganz gut was über die "Idee" hinter dem Code zu wissen, wenn beide Konstruktoren das gleiche tun sollen, kannst Du einfach sagen "falls es den Parameter nicht gibt, weise dem String einfach folgenden Wert zu. Dazu schreibst du hinter den Variablennamen ein Gleichheitszeichen und den Wert der für die Initialisierung genutzt werden soll, falls kein Wert beim Funktionsaufruf übergeben wurde. Denk dran, dass fehlende Werte nur durchgehend von rechts nach links auftreten dürfen, also keine "Löcher" in den angegebenen Argumenten sein dürfen - sonst gäbs ein "was gehört jetzt wozu"-Problem.

Übrigens: hat das Forum da drüben keine Code-Tags? Die machen Code wirklich lesbarer.

mampfi
Beiträge: 1973
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi » 06.04.2016 18:53:42

Ja ich habe davon Abstand genommen, den ganzen Quellcode zu posten.

Endgültiges Projektziel ist Eingabefelder aus mysql-Datenbanken automatisch in einer ui-Datei zu generieren.

Also die "Maskendatei" des qt-Entwicklungsystems.

Die Ui-Datei von qt ist im xml-Format.

Die Klasse fileclass_xml generiert eine xml-Datei,
die Klasse fileclass_ui sozusagen den Nachfahren.


Zentrale ist bei beiden die Methode "write_all_recs", die im Hauptprogramm aufgerufen wird und die ganze Datei schreibt.

Die Konstruktoren beider Klassen öffnen die Datei.
die Destruktoren machen sie wieder zu.

Ursprünglich hatte ich in fileclass_xml einen parameterlosen Konstruktor, der automatisch dateiname_string einen Dateinamen vergibt,
den wollte ich mir jetzt sparen und nur noch die folgenden verwenden:

Code: Alles auswählen

fileclass_xml(string para_dateiname_string); 
fileclass_ui(string para_dateiname_string);
Jetzt ist es aber so, dass das Programm nur kompiliert und funktioniert, wenn folgende Routine noch in der file_class_xml vorhanden ist.

Code: Alles auswählen

fileclass_xml() { debug_writeln("HIER IST Konstruktor fileclass_xml::fileclass_xml() ohne Parameter"); }                                       //kxml1
Diese Routine wird offenbar vom Konstruktor in fileclass_ui aufgerufen, und muss laut Compiler wohl vorhanden sein.

Meines Wissens gibt es keine Verpflichtung, dass bei den Konstruktoren ein parameterloser vorhanden sein muss.

P.S.
debug_writeln ist nur ein Aufruf von cout und hat mit den Klassen nichts zu tun.
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von peschmae » 06.04.2016 19:38:58

mampfi hat geschrieben: Meines Wissens gibt es keine Verpflichtung, dass bei den Konstruktoren ein parameterloser vorhanden sein muss.
Richtig. Aber: In C++ muss jedes Objekt das du erstellst konstruiert werden - d.h. ein Default-Konstruktor oder ein von dir erstellter Konstruktor wird aufgerufen.

Wenn du jetzt eine Klassenhierarchie hast und ein Objekt der abgeleitenen Klasse instantiierst, enthält das ja Member-Variablen der Basisklasse und der Abgeleiteten Klasse.

Damit alles auch immer schön initialisiert ist, wird immer zuerst ein Konstruktor der Basisklasse aufgerufen. Der "sieht" und initialisiert nur seine Member und weiss nicht dass das Ganze am Ende ein Objekt der abgeleiteten Kasse werden soll. Das ist nötig falls der z.B. private Member der Basisklasse initialisieren muss, oder etc...

Erst danach wird der Konstruktor der abgeleiteten Klasse aufgerufen.

In deinem Fall steht hier

Code: Alles auswählen

fileclass_ui::fileclass_ui(string para_dateiname_string) //Zeile 186
nicht wie die Basisklasse zu konstruieren ist, daher soll der argumentlose Default-Konstruktor aufgerufen werden; und den gibts nicht mehr sobald du einen anderen machst.

Mit

Code: Alles auswählen

fileclass_ui::fileclass_ui(string para_dateiname_string) : fileclass_xml(para_dateiname_string)
{}
könntest du z.B. explizit den String-Konstruktor der Basisklasse benutzen.

Grundsätzlich ist dein Problem aber wohl dass du die ganze Funktionalität in beiden Klassen duplizierst. Wenn deine ui-Klasse von der xml-Klasse erbt, dann hat sie damit schon alle Membervariablen der Basisklasse (fstream datei; string dateiname_string;)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

mampfi
Beiträge: 1973
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi » 07.04.2016 12:16:22

Zunächst danke, dass Ihr dem Link gefolgt seid. :-)

Die Ausführung von dem parameterlosen Konstruktor steht nur im Deklarationsteil, damit das aus- und einkommentieren schneller ging. ;-)



Wobei ich den Konstruktor ja explicit aufrufe.

Es war zwar im Link das Hauptprogramm drin, aber ich schreibs hier nochmal rein:

(Funktioniert zwar mit der Deklaration des "überflüssigen parameterlosen Konstruktors" in der Elternklasse wäre aber doch interessant, warum der g++ darauf besteht).

int main()

{
//fileclass_xml wr("datei_fileclass_xml.xml");

fileclass_ui wr("datei.xml");

wr.write_all_recs();
}



P.S.
Der Tipp mit dem Gleichheitszeichen von Eggy ist nicht vergessen.
Es gibt viele Foren und eine Welt ausserhalb

mampfi
Beiträge: 1973
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi » 07.04.2016 12:33:26

Ah eine Antwort im qt-Forum.
Es gibt viele Foren und eine Welt ausserhalb

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von eggy » 07.04.2016 13:42:50

Angenommen Du hast in der .h

foo();
foo(int bla);

als mögliche Varianten des Konstruktors aufgeführt, dann erwartet der Compiler später auch die entsprechende Erklärungen, was die jeweiligen Konstruktoren tun sollen,
foo(){
//....
}

foo(int bla) {
// ...
}
vorzufinden.

Wenn Du ihm welche davon vorenthältst verwirrt ihn das eben sehr, und er wirft zur Strafe mit Fehlermeldungen um sich.

Soweit erstmal klar?

mampfi
Beiträge: 1973
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi » 07.04.2016 20:31:46

Bin jetzt gerade am Überlegen, ob ich doch den ganzen Quellcode poste.

Also in h-Dateien sprich externen Dateien sind Klassen enthalten.
Es gibt viele Foren und eine Welt ausserhalb

Antworten