"Temporäre Strukturen"



  • Hi :schland:

    ich habe folgende Struktur für einen Vektor:

    struct Vector 
    { 
       int x, y;
    };
    

    Und die möchte ich für Funktionen benutzen, die einen Vektor als Parameter erwartet:

    Vector AddVector(Vector vec1, Vector vec2);
    

    Wie kann ich der Funktion jetzt am elegantesten "temporäre Vektoren" übergeben? Vector ist leider nur eine struct ohne Konstruktur, wenn dem nicht so wäre, könnte ich ja einfach...

    Vector result = AddVector(Vector(1, 2), Vector(5, 4));
    

    ...schreiben. Da ich aber auf die Implementierung nicht zugreifen kann, muss ich eine andere Lösung finden.

    Mögliche Lösungen wären...

    • Eine kleine Wrapper-Klasse mit Konvertierungoperator zu Vector
    • Eine Funktion, die mir einen Vector zurückliefert (als Ersatz für den Konstruktor)

    Welche Möglichkeit sollte ich bevorzugen, bzw. hättet ihr eine bessere Lösung, oder sogar eine mir unbekannte Kurzschreibweise, die mein Problem lösen könnte?

    Danke & viele Grüße.


  • Administrator

    Also wenn du die Vektor Struktur wirklich nich verändern kannst, dann kommt es drauf an, was du alles willst.

    Willst du nur diese Strukturen erstellen? Erstelle dir eine Funktion.
    Willst du noch mehr machen mit den Vektoren, Addition und sonstiges halt, dann erstelle dir einen eigenen Vektor, welcher konvertiert werden kann.

    Grüssli



  • Ganz spontan fiel mir da nur die Art Array zu initialisieren ein (geht auch bei Strukturen)
    Und union.

    Bsp:

    #include<iostream>
    using namespace std;
    
    struct SVector2
    {
    	int x,y;
    };
    
    //1. 
    SVector2 MacheVektor1(int x,int y)
    {
    	SVector2 Temp={x,y}; // <- Erstaz für den Konstruktor
    	return(Temp);
    }
    
    //2.
    SVector2 MacheVektor2(int x,int y)
    {
    	union Conversion // <- union, Speicher wird von v und x,y geteilt (= der selbe Speicherbereich)
    	{
    		SVector2 v;
    		struct
    		{
    			int x,y;
    		};
    	} conv;
    
    	conv.x=x;
    	conv.y=y;
    	return(conv.v);
    }
    
    int main()
    {
    	SVector2 v=MacheVektor1(1,1);
    	cout<<"\nX="<<v.x
    		<<"\nY="<<v.y<<endl;
    
    	v=MacheVektor2(2,2);
    	cout<<"\nX="<<v.x
    		<<"\nY="<<v.y<<endl;
    
    	return(0);
    }
    

    :schland: :schland: :schland: :schland: :schland: :schland: :schland: :schland: :schland: Ich vermisse das Ball-Icon 🕶


  • Mod

    Anonyme structs gibt es nicht in Standard C++. Abgesehen davon sehe ich nicht, was MacheVektor2 anders macht als MacheVektor1. Funktion-die-Vector-zurückgibt ist die richtige Lösung. Der Unterschied zu einem direkten Konstruktoraufruf ist ohnehin minimal. Eine benannte Funktion gibt zwar prinzipiell eine Kopie zurück, die Kopieraktion kann und wird aber trivial von jedem modernen Compiler eliminiert werden.


Anmelden zum Antworten