transform benötigt 'standardkonstruktor'



  • Hallo, ich habe noch mal eine Frage. Ich probiere gerade etwas mit den Funktionen der STL rum und verstehe das momentane Verhalten nicht.
    In dem Programm wird ein Vektor aus Bauteilen erzeugt, anschliessend wird der Vektor an die Funktion transform übergeben. Diese soll anhand der Funktion baue_auto(CBauteile) Autos 'produzieren' und sie in dem Vektor autos speichern.
    Jedes bauteil hat eine Nummer und diese wird auch für das jeweilige Auto übernommen.
    Allerdings klappt dies nur, wenn ich einen Standardkonstruktor (ohne Parameter) in die Klasse CAuto implementiere. Ansonsten kriege ich die Fehlermeldung:

    microsoft visual studio 10.0\vc\include\memory(631): error C2512: 'CAuto::CAuto': Kein geeigneter Standardkonstruktor verfügbar
    
    microsoft visual studio 10.0\vc\include\memory(672): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void std::_Uninit_def_fill_n<_FwdIt,_Diff,_Tval,_Alloc,CAuto>(_FwdIt,_Diff,const _Tval *,_Alloc &,_Valty *,std::_Nonscalar_ptr_iterator_tag)".
    

    Dies ist aber unlogisch, da ich den Standardkonstruktor eigentlich gar nicht benötige. Schliesslich muss ich jedem Auto die Nummer übergeben. Des weiteren wird der Standardkonstruktor offenbar auch gar nicht benutzt, da es kein Auto mit der Nr -1 gibt.

    Hier ist der funktionierende Code:

    #include "CinTest.h"
    
    using namespace std;
    
    class CBauteile
    {
    public:
    	CBauteile(int iNr) {
    		_iNr = iNr;
    	}
    	int iNr() {return _iNr;}
    private:
    	int _iNr;
    };
    
    class CAuto
    {
    public:
    	CAuto() { //dieser Konstruktor wird zum Kompillieren benötigt!! (!!!!!)
    		_iNr = -1;
    		_iSprit = 0;
    	}
    	CAuto(int iNr) {
    		_iNr = iNr;
    		_iSprit = 0;
    	}
    	void tanken(int iNeuerSprit) {
    		if (iNeuerSprit > 100)
    			iNeuerSprit = 100;
    		cout << "Auto Nr. " << _iNr << " wird auf " << iNeuerSprit << " betankt!" << endl;
    		_iSprit = iNeuerSprit;
    	}
    	int iNr() {return _iNr;}
    private:
    	int _iNr, _iSprit;
    };
    
    CAuto baue_autos(CBauteile teile) {
    	cout << "Auto mit Nr. " << teile.iNr() << " wird gebaut!" << endl;
    	return CAuto(teile.iNr());
    }
    
    int main(int argc, char *argv[]) {
    	vector <CBauteile> bauteile;
    	vector<CAuto> autos;
    	for (int i=0;i<10;i++) 
    		bauteile.push_back(CBauteile(i * 10)); //allen bauteilen eine nr zuweisen
    
    	autos.resize(bauteile.size());
    	transform(bauteile.begin(), bauteile.end(), autos.begin(), baue_autos); //die autos werden mit den bauteilen gebaut, aber die Nr bleibt erhalten
    
    	for (vector<CAuto>::iterator it=autos.begin();it!=autos.end();it++) {
    		cout << "Auto hat Nr. " << it->iNr() << endl;
    	}
    	cin.get();
    	return 0;
    }
    

    Ausgabe: http://www.imagebanana.com/view/9apfdnld/konsole.png

    Sobald ich nun den Konstruktor in Zeile 19 lösche, kriege ich die vorhin genannten Fehlermeldungen.

    CAuto() { //dieser Konstruktor wird zum Kompillieren benötigt!! (!!!!!)
    		_iNr = -1;
    		_iSprit = 0;
    	}
    


  • Edit: quatsch weg



  • Das resize() füllt Dir den vector mit Autos, die mit deren Standardkonstruktor konstruiert werden.



  • Oh, da habe ich gar nicht drauf geachtet. Ich habe den Fehler vor allem im Zusammenhang mit transform wargenommen. Dankeschön 👍


  • Mod

    statt resize vorher, sollte transform mit einem back_inserter arbeiten (und man kann, wenn man will, vorher ein reserve durchführen).
    oder du nimmst den transform_iterator aus boost und initialisierst den auto-vector direkt im Konstruktor.


Anmelden zum Antworten