Mit Klasse vector einer Klasse füllen



  • N Abend,

    wie bekomme ich die aufwändig in Function errechneten Daten in den vector der Klasse Graph. Am besten keine schmutzigen Tricks :p

    class Function{
    	Function->calc(); 
    }
    
    class Graph{
    	std::vector<xy>Daten;
    }
    

    Danke!

    Kasper



  • return benutzen und zuweisen wäre nicht schlecht.



  • der vector ist relativ groß. gibt's ne möglichkeit per referenz oder zeiger


  • Mod

    Klassenkasper schrieb:

    der vector ist relativ groß. gibt's ne möglichkeit per referenz oder zeiger

    Das wird der vector schon automatisch per Verschiebung erledigen.



  • SeppJ schrieb:

    Das wird der vector schon automatisch per Verschiebung erledigen.

    Verschiebung? Also einfach :

    vector<xy> Function->calc(){return vector<xy> Data;}

    void Graph->SetData(vector<xy> Data)
    Graph->SetData(Function->calc());

    Ich dachte das hier der komplette vector kopiert wird? Na gut.

    ... noch etwas, Function hat noch ein paar Daten als vector vorliegen die Graph kennen sollte aber nicht ändern darf.
    Gibt es da eine Lösung zur Verknüpfung?

    Danke.

    Kasper



  • Klassenkasper schrieb:

    Ich dachte das hier der komplette vector kopiert wird? Na gut.

    Man kann vektoren auf jeden Fall "umziehen" lassen (ohne dass da was kopiert wird) und das kann auch automatisch passieren. Kommt aber drauf an. Zeig doch zur Abwechselung mal kompilierbaren Code, damit man das an deinem konkreten Beispiel erklären kann. 🙂

    Klassenkasper schrieb:

    ... noch etwas, Function hat noch ein paar Daten als vector vorliegen die Graph kennen sollte aber nicht ändern darf.
    Gibt es da eine Lösung zur Verknüpfung?

    Wenn Du Dir sicher bist, dass ein vector von diesem Function-Objekt lange genug existiert, kannst Du dir natürlich woanders einen const-Zeiger merken:

    struct foo { vector<int> data; };
    struct bar { vector<int> const* ptr; };
    int main() {
       foo f;
       bar b;
       b.ptr = &f.data;
    }
    


  • krümelkacker schrieb:

    ... Zeig doch zur Abwechselung mal kompilierbaren Code, damit man das an deinem konkreten Beispiel erklären kann. 🙂

    soo, bitte:

    #include  <vector>
    
    using namespace std;
    
    class yps {
    private:
    	int y0;
    	int y1;
    	int yn;
    
    public:
    	void setyps(long double iny0, long double iny1, long double inyn){
    		y0=iny0;
    		y1=iny1;
    		yn=inyn;
    	}
    
    	int getyn(){return yn;}
    	yps();
    };
    
    class Fct {
    private:
    	vector<int>Info;
    public:
    	vector<yps>calc(){
    		vector<yps>Daten;
    		Daten.resize(13);
    		Daten[1].setyps(8, 2, 1);
    		return Daten;
    	}
    
    	// int & Ints(){
    	// Info.resize(8, 132);
    	// return & Info;
    	// }
    };
    
    class Graph {
    private:
    	vector<yps>Daten;
    	Fct* fnc;
    	vector<int> *inf;
    
    public:
    	void test(){
    		// inf  =fct->Ints();
    		Daten=fnc->calc();
    	}
    };
    
    int main(){
    	Graph Test;
    	Test.test();
    }
    

    Ist nur ein Beispiel und macht wenig Sinn.

    Zieht der vector mit "fnc->calc()" um oder wird kopiert?
    Und wie kann ich das beinflussen?

    Wie bekomme ich die auskommenierten Stellen zum Laufen?

    Danke krümelkacker!

    Klassenkasper



  • Ich verstehe nicht was du mit "umziehen" im Bezug auf den Vektor meinst.

    In der calc Funktion wird der Vektor gemoved werden. (Zumindest wenn du mit Optimierungsflags kompilierst).

    Deine auskommentierten Stellen bekommst du zum Beispiel so zum laufen:

    std::vector<int> Ints(){
         Info.resize(8, 132);
         return Info;
         }
    };
    
    class Graph {
    private:
        vector<yps>Daten;
        Fct* fnc;
        vector<int> inf;
    
    public:
        void test(){
            inf  =fnc->Ints();
            Daten=fnc->calc();
        }
    

    Zeiger auf Datenkonstruktre in anderen Klassen zeigen zu lassen kann gefährlich sein. Denn wenn dein Objekt da zerstört wird, zeigt der Pointer irgendwo ins Nirvana.


Anmelden zum Antworten