[Erledigt] Variable Argumente auswerten



  • Hallo Leute,

    ich möchte einen std::vector in Abhängigkeit von der Argumentzahl füttern:

    Hier die Klasse:

    class Knot : public Topoobject{
    
    private:
    
    	std::vector<Coord> coordinatesystem;
    
    public:
    
    	Knot();
    	Knot(Coord first);
    	Knot(Coord first,Coord second);
    	Knot(Coord first,Coord second,Coord third);
    
    	Coord get_sys(puint format) const;
    	void set_sys(Coord new_coord,puint format);
    
    };
    

    So habe ich es bisher gemacht:

    Knot::Knot():Topoobject(propknot) { 
    
    	for(int i=0;i<Geotopology::maxdim;i++){
    		Coord tmpcoord;
    		this->coordinatesystem[i] = tmpcoord;
    	}
    
    }
    
    Knot::Knot(Coord new_first):Topoobject(propknot){ 
    	this->coordinatesystem[0] = new_first;
    }
    
    Knot::Knot(Coord new_first,Coord new_second):Topoobject(propknot){ 
    	this->coordinatesystem[0] = new_first;
    	this->coordinatesystem[1] = new_second;
    }
    
    Knot::Knot(Coord new_first,Coord new_second,Coord new_third):Topoobject(propknot){ 
    	this->coordinatesystem[0] = new_first;
    	this->coordinatesystem[1] = new_second;
    	this->coordinatesystem[2] = new_third;
    }
    
    Coord Knot::get_sys(puint sys_id) const { 
    	assert(sys_id<coordinatesystem.size() && sys_id > 0);
    	return this->coordinatesystem[sys_id]; 
    }
    
    void Knot::set_sys(Coord coordinate,puint sys_id) { 
    	assert(sys_id<coordinatesystem.size() && sys_id > 0);
    	this->coordinatesystem[sys_id] = coordinate;
    }
    

    Fängt aber nach der dritten Dimension an zu stinken,
    wegen den zusätzlichen Konstruktoren.

    Wie könnte man diese variable Anzahl in den Vektor bringen?
    Wie ist es bei der Übergabe? Kann ich hier irgendwo, vor allem in
    get_ oder set_ mit Referenzen arbeiten?



  • Warum benutzt du einen vector, wenn die Anzahl fest steht? (ich nehme mal an, dass du 3 Dimensional bleiben willst).

    Für 1,2 oder 3 Dimensionale Knoten würde ich sogar verschiedene Klassen machen. In C++0x gibt es dann variadic templates, mit denen man das auch ein wenig generischer machen kann und nur noch ein template braucht.

    Ansonsten allgemein könntest du einen Container ja an den Konstruktor übergeben und dann mit einer Schleife füllen, respektive einfach kopieren.



  • drakon schrieb:

    ich nehme mal an, dass du 3 Dimensional bleiben willst

    Ich habe bisher nur bis drei geschafft, dann wars mir zu doof.
    Es geht tatsächlich weiter als drei.
    Alleine wegen der Wiederverwertbarkeit der variablen Argumente,
    würde ich es gern sehen. In C gibt es ja die weniger schöne ( ... )

    drakon schrieb:

    Für 1,2 oder 3 Dimensionale Knoten würde ich sogar verschiedene Klassen machen.

    Warum?

    drakon schrieb:

    In C++0x gibt es dann variadic templates, mit denen man das auch ein wenig generischer machen kann und nur noch ein template braucht.

    Templates, vorallem deren Kompilerfehlermeldungen, rufen bei mir regelmäßig frustrationen hervor.

    drakon schrieb:

    Ansonsten allgemein könntest du einen Container ja an den Konstruktor übergeben und dann mit einer Schleife füllen, respektive einfach kopieren.

    Hatte ich mir auch schon überlegt, da der Kontainer aber sowieso irgendwann gefüllt werden muss...



  • Ok, wenn es mehr als 3 werden, dann würde ich da wirklich einfach einen Container nehmen und den in der Klasse mit dem initialisieren. Fertig.

    Das was du in C mit der Ellipse (...) meinst kommt eben in C++0x mit variadic templates wieder, aber diesemal typsicher. 😉
    Aber das wäre dann weniger deine Wahl, da du das ja volkommen dynamischen haben möchtest.



  • Na gut, da es scheinbar nicht anders klappt bleibt es bei dem hier, falls jemand die Sucheb benutzt 🙂

    Knot::Knot(puint maxdim ...){
    
    	assert(maxdim<=Geotopology::maxdim);
    
    	va_list vl;
    	va_start(vl,maxdim);
    	this->coordinatesystem[0] = va_arg(vl,Coord);
    	for (int i=1;i<maxdim;i++) this->coordinatesystem[i] = va_arg(vl,Coord);
    	va_end(vl);
    
    }
    

    Zwar ein wenig unschön, sollte aber funktionieren.



  • Warum denn jetzt kein Container?



  • drakon schrieb:

    Warum denn jetzt kein Container?

    Weil er an verschiedenen Stellen erstmal gebaut werden müsste.
    So habe ich mögliche Fehler an einer Quelle.

    Danke für die Hilfe übrigens.


Log in to reply