vektoren mit strukturen kopieren



  • Also ich gebe einen Vektor per main funktion an den konstruktor einer klasse und möchte dort erreichen, das der vektor in der klasse , gleich dem übergebenen vektor ist.

    Nur wie stell ich das an?

    Habs so probiert:
    struktur:

    struct xy_point
    {
    	double x;  
    	double y;  
    };
    

    main fkt

    int main()
    {
    	std::vector <xy_point> a_xy(5);  //Array mit 5 Punkten (10 Punkte max!)
        //vordefiniertes Polygon
        a_xy[0].x=1.0; 
    	a_xy[0].y=4.0;
    	a_xy[1].x=2.0; 
    	a_xy[1].y=1.0;
    	a_xy[2].x=4.5; 
    	a_xy[2].y=1.0;
    	a_xy[3].x=6.0; 
    	a_xy[3].y=3.0;
    	a_xy[4].x=3.5; 
    	a_xy[4].y=5.0;
    
    	cout<<a_xy.size() <<endl;  //Anzahl der koordinaten
            POLYGON instanz(50,100,a_xy);
    	return 0;
    }
    

    konstruktor

    POLYGON(double a_x_pos,double a_y_pos,std::vector<xy_point> a_xy)
    {
     xy=a_xy;   //Hier liegt der Fehler!!!
                //Wie sieht die Zuweisung richtig aus?
    }
    

    klasse:

    class POLYGON  
    {
    public:
    	POLYGON(double a_x_pos,double a_y_pos,std::vector<xy_point> a_xy); //Prototyp Konstruktor
    	POLYGON();
    	virtual ~POLYGON();
    
    private:
    	std::vector<xy_point> xy;
    	double x_pos;
    	double y_pos;
    	double flaecheninhalt;
    };
    


  • Es wäre sehr hilfreich wenn du uns die genaue Fehlermeldung postest die du bekommst!



  • --------------------Konfiguration: 3Sem_Testat1 - Win32 Debug--------------------
    Kompilierung läuft...
    POLYGON.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\3Sem_Testat3\POLYGON.cpp(37) : warning C4508: 'POLYGON' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen
    Linker-Vorgang läuft...
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall POLYGON::POLYGON(double,double,class std::vector<struct xy_point,class std::allocator<struct xy_point> >)" (??0POLYGON@@QAE@NNV?vector@Uxy_point@@V?vector@Uxy\_point@@V?allocator@Uxy_point
    @@@std@@@std@@@Z)
    Debug/3Sem_Testat3.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    3Sem_Testat3.exe - 2 Fehler, 1 Warnung(en)

    edit:
    hab den fehler gefunden!
    der konstruktor war kein konstruktor und konnte xy nicht kennen weil

    POLYGON::
    //vor
    POLYGON(double a_x_pos,double a_y_pos,std::vector<xy_point> a_xy)
    

    fehlte.
    hm wohl beim kopieren verschütt gegangen ...



  • :arrow_right: POLYGON::POLYGON(double a_x_pos,double a_y_pos,std::vector<xy_point> a_xy) 
    { 
     xy=a_xy;   //Hier liegt der Fehler!!! 
                //Wie sieht die Zuweisung richtig aus? 
    }
    

    Sonst weiss der Compiler nicht dass die Methode zur Klasse POLYGON gehört.



  • template<typename datatype=double>
    struct point
    {
        datatype x;  
        datatype y;
        point(datatype const& x, datatype const& y) : x(x), y(y) {}
        point(point const& rhs) : x(rhs.x), y(rhs.y) {}
    };
    
    class polygon : public shape  
    {
    public:
        polygon(point const& pos, std::vector<point> const& xy) : m_pos(pos), m_xy(xy) {}
        polygon() : m_x(0.0), m_y(0.0) {};
        virtual ~polygon() {};
    
    private:
        std::vector<point> m_xy;
        point m_pos;
    };
    

    ... damit da nicht unnötig Performance verschwendet wird, weil dein Vektor 2x kopiert wird ^^ So wird er nur einmal kopiert 🙂
    Dann kannst du deine beiden Werte für die pos auch in einen Punkt packen ... durch den überladenen Konstruktor geht jetzt:

    int main()
    {
        std::vector<point> data;
        data.push_back(point(1.0, 4.0));
        data.push_back(point(2.0, 1.0));
        data.push_back(point(4.5, 1.0));
        data.push_back(point(6.0, 3.0));
        data.push_back(point(3.5, 5.0));
        polygon shape_inst(point(50.0, 100.0), data);   
    }
    

    ...


Log in to reply