Hinzufügen von Elementen zu einem Vektor
-
@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").
-
@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 einstd::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 glaubeC++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.
-
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
Danke, ich denke so sollte es passen
Ich dachte ausgehend von Deinem Beispiel, daß Du die Koordinaten schon gerne in drei seperaten Variablen hättest. Deshalb mein Beispiel weiter oben.
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
Das einzige was ich noch nicht weiß ist, was das zweite const hinter der Klammer bringt.
Dieses "zweite"
const
sagt aus, daß die Methode die Instanz nicht verändert (und auch nicht verändern darf). Dh. sie darf keine Member ändern und auch keine anderen non-const
Methoden aufrufen. Technisch gesagt,this
ist in solch einer Methode ein Zeiger aufconst T
.
-
@Swordfish sagte in Hinzufügen von Elementen zu einem Vektor:
Ich dachte ausgehend von Deinem Beispiel, daß Du die Koordinaten schon gerne in drei seperaten Variablen hättest. Deshalb mein Beispiel weiter oben.
Eigentlich schon, aber ich glaube an der Uni haben die noch C++ 14, dann schreibe ich es lieber so und dann ist halt eine Zeile mehr in der main().
Danke auf jeden Fall für deine Hilfe!