C++ - Problem mit Weglassen parameterlosem Konstruktor

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi »

Ich poste jetzt hier mal die relevanten Methoden:


Ich habe zwei Klassen: fileclass_ui erbt von fileclass_xml

wenn ich den nicht mehr benötigten Konstruktor "fileclass_xml()" (siehe "Problemstelle") auskommentiere dann bekomme ich folgende Fehlermeldung:




cpp_xml.cpp: In constructor ‘fileclass_ui::fileclass_ui(std::string)’:
cpp_xml.cpp:186:56: error: no matching function for call to ‘fileclass_xml::fileclass_xml()’
fileclass_ui::fileclass_ui(string para_dateiname_string)
^
cpp_xml.cpp:186:56: note: candidates are:
cpp_xml.cpp:52:1: note: fileclass_xml::fileclass_xml(std::string)
fileclass_xml::fileclass_xml(string para_dateiname_string)
^
cpp_xml.cpp:52:1: note: candidate expects 1 argument, 0 provided
cpp_xml.cpp:19:7: note: fileclass_xml::fileclass_xml(const fileclass_xml&)
class fileclass_xml
^
cpp_xml.cpp:19:7: note: candidate expects 1 argument, 0 provided
mv: der Aufruf von stat für „a.out“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

---------------------------------------------------------------------------------------

class fileclass_xml
{
protected:

int i;
int n;


fstream datei;
string dateiname_string;


public:
//protected: geht nicht

//fileclass_xml() { debug_writeln("HIER IST Konstruktor fileclass_xml::fileclass_xml() ohne Parameter"); } //Problemstelle

fileclass_xml(string para_dateiname_string);
~fileclass_xml();

void init();

void write_header();
void write_bottom();


void write_token(string token_name, string wert);
void writerec(string widget_class, string widget_name);

void write_all_recs();
};

---------------------------------------------------------------------------------------

//ui
class fileclass_ui : public fileclass_xml
{
protected:

int max_n;


public:

fileclass_ui(string para_dateiname_string);
~fileclass_ui();

fstream datei;
string dateiname_string;

int x, y, width, height; //werden momentan nicht alle benutzt
string x_string, y_string, width_string, height_string;

string feldwert[256];

void init();
void write_header();
void write_bottom();
void write_fields();

void write_widget_class(string widget_class, string widget_name);
void write_property_string();

void writerec(string widget_class, string widget_name);

void write_all_recs();
};

---------------------------------------------------------------------------------------

Auschnitt von fileclass:ui:



//----- KONSTRUKTOR ---------------------------------------
//kui
fileclass_ui::fileclass_ui(string para_dateiname_string) //Zeile 186
{
dateiname_string = para_dateiname_string;
cout << "Hier ist KONSTRUKTOR fileclass_ui::~fileclass_ui() dateiname_string = " << dateiname_string << endl; //debug

//dateiname_string = "datei.xml";


datei.open(dateiname_string.c_str(), ios::in | ios::out | ios::trunc);
//datei.open(dateiname_string.c_str() );

if (!datei)
{
cout << "Datei nicht verfügbar" << endl;
}


init();
} //fileclass_ui::fileclass_ui para



void fileclass_ui::write_all_recs()

{
cout << "fileclass_xml::write_all_recs() dateiname_string = " << dateiname_string << endl; //debug

write_header();

x_string="400"; width_string="200"; height_string="25";
y=50;

//write_fields(); //d1 Hier Aufruf write_fields

write_bottom(); //d2
}

/*********************************************************************************************************************************************/
/*********************************************************************************************************************************************/
/*********************************************************************************************************************************************/

int main()

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

fileclass_ui wr("datei.xml");

wr.write_all_recs();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von Christian81 »

Wo liegt jetzt das Problem? Im ctor von fileclass_ui rufst Du keinen ctor von fileclass_xml auf, also wählt der Compiler automatisch den Default-ctor. Und da du diesen auskommentiert hast, gibts die Fehlermeldung.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi »

Zunächst ein Link (parallel im debian-Forum gepostet): https://debianforum.de/forum/viewtopic. ... 5#p1086045


Das ist ja gerade das Problem.

In der Elternklasse fileclass_xml ist auch ein Konstruktor mit den selben Parametern,

der parameterlose Konstruktor sollte eigentlich wegfallen, auf den besteht aber der G++.

Wenn ich die Kind-Klasse so deklariere: fileclass_ui wr("datei.xml");

Dann wird der parameterlose Konstruktor der Elternklasse (fileclass_xml) aufgerufen (wenn er nicht aufgerufen wird).
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von Christian81 »

Nochmal:
im ctor von fileclass_ui (fileclass_ui::fileclass_ui(string para_dateiname_string)) rufst du nicht den ctor der Basisklasse auf. Also versucht der Compiler, den default-ctor der Basisklasse aufzurufen welcher nicht existiert, also kommt die Fehlermeldung. Du musst dem Compiler schon sagen welchem ctor (und vor allem mit welchen Parametern) der Basisklasse er im ctor von fileclass_ui aufrufen soll...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von mampfi »

Ich mir nicht sicher, ob ich Dich richtig verstanden habe. Wenn ja, dann müsste ich ja manuell alle gleichen Methoden der Elternklassen aufrufen.


Damits klarer wird, die beiden Konstruktoren (auskommentiertes Zeug hab ich weggelassen)

ELTERNKLASSE:

fileclass_xml::fileclass_xml(string para_dateiname_string)
{
dateiname_string = para_dateiname_string;

datei.open(dateiname_string.c_str(), ios::in | ios::out | ios::trunc);

if (!datei)
{
cout << "Datei nicht verfügbar" << endl;
}
} //fileclass_ui::fileclass_xml para

KINDKLASSE:

fileclass_ui::fileclass_ui(string para_dateiname_string)
{
dateiname_string = para_dateiname_string;
cout << "Hier ist KONSTRUKTOR fileclass_ui::~fileclass_ui() dateiname_string = " << dateiname_string << endl; //debug

//dateiname_string = "datei.xml";


datei.open(dateiname_string.c_str(), ios::in | ios::out | ios::trunc);

if (!datei)
{
cout << "Datei nicht verfügbar" << endl;
}


init();
} //fileclass_ui::fileclass_ui para


Aufruf Hauptprogramm:

int main()

{
fileclass_ui wr("datei.xml");

wr.write_all_recs();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: C++ - Problem mit Weglassen parameterlosem Konstruktor

Beitrag von Christian81 »

Code: Alles auswählen

fileclass_ui::fileclass_ui(string para_dateiname_string)
 : fileclass_xml(para_dateiname_string)
{}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten