Hinzufügen von Elementen zu einem Vektor



  • Moin, ich bin gerade dabei eine Funktion zu schreiben, die Elemente zu einem Vektor hinzufügen soll. Ich habe es wie folgt versucht, aber ich bekomme die Fehlermedung, dass die Klasse standard Vektor keine Funktion push_back hat. Was muss ich anders machen, damit es funktioniert?

    #pragma once
    
    #include <vector>
    
    class Material
    {
    private:
    	std::vector<unsigned> Z;
    	std::vector<double> fraction;
    public:
    	Material();
    	Material(const Material& other);
    	~Material();
    	void addElement(unsigned newZ, double newFraction);
    };
    
    #include <vector>
    #include <iostream>
    #include "Material.h"
    
    using namespace std;
    
    void Material::addElement(unsigned newZ, double newFraction)
    {
    	Z.push_back(newZ);
    	fraction.push_back(newFraction);
    }
    

  • Mod

    Problem lässt sich nicht nachvollziehen. Wenn du Problem hast, bitte den Code soweit wie möglich reduzieren (das hast du anscheinend gemacht 👍 - ich vermute das zufällige Semikolon mitten im Code kommt daher), aber auch unbedingt prüfen, ob der reduzierte Code den Fehler auch überhaupt noch zeigt.

    Ansonsten, unabhängig von deinem Problem:

    	Material();
    	Material(const Material& other);
    	~Material();
    

    Das schaut nach gefährlich schlechtem Stil aus. Stichwort zum Googeln: Rule of zero. Wobei das vielleicht etwas komplex zu verstehen ist für einen Anfänger. Andersrum gefragt wird's vielleicht deutlicher: Wozu/Warum hast du diese Zeilen geschrieben?



  • @thefighter sagte in Hinzufügen von Elementen zu einem Vektor:

    aber ich bekomme die Fehlermedung, dass die Klasse standard Vektor keine Funktion push_back hat.

    Fehlermeldung: Copy&Paste



  • OK, keine Ahnung woran das lag, habe Visual Studio neu gestartet und jetzt geht es wieder...



  • @SeppJ Diese beiden habe ich nicht geschrieben, die erzeugt Visual Studio automatisch, wenn man eine neue Klasse anlegt.

    Material();
    ~Material();
    

    Und diese Methode gibt es auch im c-File, die habe ich nur mit rausgelöscht.

    Material(const Material& other);
    
    //copy constructor
    Material::Material(const Material& other)
    {
    	Z = other.Z;
    	fraction = other.fraction;
    	density = other.density; //in g/cm^3
    	name = other.name;
    }
    


  • @thefighter sagte in Hinzufügen von Elementen zu einem Vektor:

    //copy constructor
    Material::Material(const Material& other)
    

    Wenn das alles ist was dein copy-ctor tut, dann brauchst Du ihn nicht hinschreiben, dann reicht der default-generierte. Wie @SeppJ schon gesagt hat, schau mal nach der Rule of Zero (im Gegensatz zu der "Rule of Three" oder der "Rule of Four and a Half" oder der "Rule of Five").


  • Mod

    @thefighter sagte in Hinzufügen von Elementen zu einem Vektor:

    @SeppJ Diese beiden habe ich nicht geschrieben, die erzeugt Visual Studio automatisch, wenn man eine neue Klasse anlegt.

    Boah. Bad practices, verbreitet durch die IDE 👎

    Kann ein mitlesender Visual-Studio-Nutzer erklären, wie man solchen Schmarren abschalten kann?



  • @SeppJ Eclipse CDT macht das auch, allerdings mit checkbox (default an). Visual-Studio sicherlich auch per checkbox ausschaltbar.



  • @Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:

    Visual-Studio sicherlich auch per checkbox ausschaltbar.

    Nicht im "Add Class" Dialog selbst. Auch sonst habe ich keine Konfigurationsmöglichkeit dafür gefunden.

    Man kann höchstens die Klasse erst mit "Add Class" erzeugen lassen und danach mit dem "Class Wizzard" bearbeiten. Und selst damit werden Methoden die man löscht nur zeilenweise auskommentiert. duh.

    Alles umständlicher als den default-ctor und den dtor einfach per Hand zu löschen.



  • Ich verwende den ollen Add-Class Wizard nie. Wozu sollte ich auch? Weil es so schwer ist sich zu merken wie man

    #pragma once
    
    class Foo
    {
    public:
    };
    

    mit Hand schreibt?

    Bei Framework-Zeugs ala ATL, MFC & Co. ist das was anderes, aber da liefert der Wizard auch meist keinen kompletten Schmarrn ab.



  • @hustbaer sagte in Hinzufügen von Elementen zu einem Vektor:

    Ich verwende den ollen Add-Class Wizard nie. Wozu sollte ich auch?

    Das.



  • Ich hab den Wizard auch noch nie verwendet. Der macht noch mehr Quatsch, z.B. void Parameter.



  • @Swordfish sagte in Hinzufügen von Elementen zu einem Vektor:

    @Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:

    Visual-Studio sicherlich auch per checkbox ausschaltbar.

    Nicht im "Add Class" Dialog selbst. Auch sonst habe ich keine Konfigurationsmöglichkeit dafür gefunden.

    Hab ich mich mit meinem "sicherlich" echt zu weit aus dem Fenster gelehnt!?
    Schliesse mich aber dem Rest an: Brauch eh kein Mensch, diesen Dialog.



  • @Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:

    Hab ich mich mit meinem "sicherlich" echt zu weit aus dem Fenster gelehnt!?

    Daß ich mal eine Einstellung in VS nicht finde die es aber gibt ... ja, kann sein. Glaub' ich in diesem Fall aber nicht.

    @Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:

    Schliesse mich aber dem Rest an: Brauch eh kein Mensch, diesen Dialog.

    👍🏻



  • Achso nochmal ein wenig was anderes, unser Professor hat uns Getter und Setter so beigebracht:

    void Particle::getPosition(double & x, double & y, double & z)
    {
    	x = p[0];
    	y = p[1];
    	z = p[2];
    }
    
    void Particle::setPosition(const double & x, const double & y, const double & z)
    {
    	p[0] = x;
    	p[1] = y;
    	p[2] = z;
    }
    

    Würde es gerade bei den Gettern aber schöner finden, wenn das Array im Rückgabewert stehen würde. Macht man das in C++ immer so, oder gibt es da bessere Wege?



  • wie würdest du denn sonst drei werte zurück geben wollen?



  • So zum Beispiel, weiß aber nicht, ob man das auch mit Arrays machen kann

    std::vector<double> const& cSpectrum::getSpec() const
    {
    	return spec;
    }
    


  • Du kannst auch die 3 Werte in einer Klasse/Struktur zusammenfassen und ein paar nützliche Funktionen dafür anbieten. Ein gebräuchlicher Name für die Klasse wäre Vector3 😉 .



  • @thefighter sagte in Hinzufügen von Elementen zu einem Vektor:

    weiß aber nicht, ob man das auch mit Arrays machen kann

    Man kann in C++ kein rohes Array als Rückgabewert haben (per Value). Was aber geht ist wie Du schon gesagt hast zB. ein std::vector<> oder ein std::array<>. Auch ein Tuple wäre für Deinen Fall denkbar. C++17 (Structured binding declaration):

    #include <iostream>
    #include <tuple>
    
    auto foo()
    {
    	return std::make_tuple(1, 2, 3);
    }
    
    int main()
    {
    	auto [x, y, z] = foo();
    	
    	std::cout << "x = " << x << ", y = " << y << ", z = " << z << '\n';
    }
    

    Seit ich glaube C++11 (oder C++14?):

    #include <iostream>
    #include <tuple>
    
    auto foo()
    {
    	return std::make_tuple(1, 2, 3);
    }
    
    int main()
    {
    	int x, y, z;
    	std::tie(x, y, z) = foo();
    	
    	std::cout << "x = " << x << ", y = " << y << ", z = " << z << '\n';
    }
    


  • Danke, ich denke so sollte es passen

    std::array<double, 3> const & Particle::getPosition() const
    {
    	return p;
    }
    

    Das einzige was ich noch nicht weiß ist, was das zweite const hinter der Klammer bringt.


Log in to reply