C++ - Problem mit Weglassen parameterlosem Konstruktor
-
- 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
Es gibt viele Foren und eine Welt ausserhalb
Re: C++ - Problem mit Weglassen parameterlosem Konstruktor
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.
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.
-
- 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
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:
Jetzt ist es aber so, dass das Programm nur kompiliert und funktioniert, wenn folgende Routine noch in der file_class_xml vorhanden ist.
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.
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);
Code: Alles auswählen
fileclass_xml() { debug_writeln("HIER IST Konstruktor fileclass_xml::fileclass_xml() ohne Parameter"); } //kxml1
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
- 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
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.mampfi hat geschrieben: Meines Wissens gibt es keine Verpflichtung, dass bei den Konstruktoren ein parameterloser vorhanden sein muss.
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
Mit
Code: Alles auswählen
fileclass_ui::fileclass_ui(string para_dateiname_string) : fileclass_xml(para_dateiname_string)
{}
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
-
- 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
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.
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
-
- 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
Ah eine Antwort im qt-Forum.
Es gibt viele Foren und eine Welt ausserhalb
Re: C++ - Problem mit Weglassen parameterlosem Konstruktor
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?
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?
-
- 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
Bin jetzt gerade am Überlegen, ob ich doch den ganzen Quellcode poste.
Also in h-Dateien sprich externen Dateien sind Klassen enthalten.
Also in h-Dateien sprich externen Dateien sind Klassen enthalten.
Es gibt viele Foren und eine Welt ausserhalb