Seite 1 von 2
Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 3:50 pm
von gizno82
Hallo Leute,
Angenommen ihr habt eine Klasse die Messwerte verarbeitet, diese Klasse besitzt eine Membervariable in Form eines vectors vom Typ double, in dem die Messwerte nach der Verarbeitung gespeichert werden nennen wir diese Membervariable einfach mal values.
Nach der Verarbeitung der Messwerte sollen diese ausgegeben werden.
Jetzt habe ich mir folgendes überlegt, Klar könnte ich es mir einfach machen und z.b. eine Methode nennen wir sie "getValues" schreiben, die den vector values über eine for schleife durchläuft und mir jeden einzelnen Messwert über cout auf der Konsole ausgibt. Nachteil die Klasse ist nicht so abstrakt, ich bin an cout gebunden.
Ich schreibe Software lieber so universell wie möglich.
Ist es auch möglich beim aufruf von getValues an den Aufrufer einfach nur einen Pointer auf das erste Element des vectors values zurück zu geben ? Durch diesen Pointer hat der Aufrufer dann das erste Element und kann in einer for Schleife dann so lange die Adresse inkrementieren, bis er das Ende des vectors values erreicht hat.
Wäre das so okay oder löst man so etwas anderst ?
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 4:20 pm
von Xin
gizno82 hat geschrieben:Ist es auch möglich beim aufruf von getValues an den Aufrufer einfach nur einen Pointer auf das erste Element des vectors values zurück zu geben ? Durch diesen Pointer hat der Aufrufer dann das erste Element und kann in einer for Schleife dann so lange die Adresse inkrementieren, bis er das Ende des vectors values erreicht hat.
Ja, das ist möglich und führt vermutlich direkt ins Desaster. Anders ausgedrückt: Lass das!
In der STL gibt es sogenante Iteratoren dafür.
Übergib eine konstante Referenz auf den Vector.
Code: Alles auswählen
std::vector<double> const & getValues()
{
return Values;
}
Nun kann sich eine beliebige Funktion einen Iterator bauen:
Code: Alles auswählen
std::vector<double> const & v = werte.getValues();
for( std::vector<double>::const_iterator it = v.begin(); it != v.end(); it++ )
{
cout << "Wert ist: " << *it;
}
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 4:50 pm
von gizno82
Danke Xin
Grüße Gizno
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 5:35 pm
von gizno82
Angenommen meine Klasse heißt measurement
was wäre dann der Rückgabetyp der Methode getValue, wenn ich die Klassendeklaration in einer Header Datei vornehme und Die Implementierung in einer .cpp source Datei ?
Wenn eine Methode z.B einen Integer zurück gibt ist mir das klar, dann sieht das so aus:
int Klassenname::Methodenname()
{
...
}
wie sieht jetzt der Funktionskopf meiner getValues Methode aus die ja eine konstante Referenz auf den Vektor zurück gibt ?
etwa so ?
Code: Alles auswählen
std::vector<double> const & measurement::getValues()
{
//...
}
@Xin wieso muss die referenz eigentlich konstant sein, was steckt dahinter ?
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 5:44 pm
von Xin
gizno82 hat geschrieben:wie sieht jetzt der Funktionskopf meiner getValues Methode aus die ja eine konstante Referenz auf den Vektor zurück gibt ?
etwa so ?
Code: Alles auswählen
std::vector<double> const & measurement::getValues()
{
//...
}
Yepp, genau so.
Noch besser wäre:
Code: Alles auswählen
std::vector<double> const & measurement::getValues() const // <- hier kommt noch ein const hinter
{
//...
}
Das zweite 'const' sagt aus, dass Du die Methode auch dann rufen kannst, wenn Du eine konstante Instanz von meassurement nach ihren Werten fragen möchtest.
gizno82 hat geschrieben:@Xin wieso muss die referenz eigentlich konstant sein, was steckt dahinter ?
Damit Du die Änderungen der Daten durch die Klasse vornehmen musst und nicht jeder, der mal eben getValues() aufruft, diese auch ändert darf.
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 5:56 pm
von gizno82
Danke Xin,
Super das es Proggen.org gibt, hier bekommt man Hilfestellung von kompetenten Programmierern und wird nicht gleich mit dummen Kommentaren von inkompetenten leuten runter gemacht wie das bei manchen Foren der Fall ist.
Danke
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 6:21 pm
von Xin
gizno82 hat geschrieben:Super das es Proggen.org gibt, hier bekommt man Hilfestellung von kompetenten Programmierern und wird nicht gleich mit dummen Kommentaren von inkompetenten leuten runter gemacht wie das bei manchen Foren der Fall ist.
Wenn Du ein kompetenter Programmierer bist, nicht einfach abhauen, sondern mithelfen. ^^
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 6:32 pm
von gizno82
Noch mal eine Sache,
Wie muss ich vorgehen, wenn ich meinen Vektor Dynamisch erzeugen möchte.
Sprich Den Benutzer fragen wie viele Messwerte er erfassen möchte die Eingabe in einer Integer Variable speichern,
Diese Variable dann beim Instanzieren der cMeasurement Klasse dem Konstruktor als Größenangabe für den Vektor values übergeben.
Hier mal meine Klassendeklaration:
Code: Alles auswählen
#ifndef CBRIDGE_H_
#define CBRIDGE_H_
#include <vector>
using namespace std;
class cMeasurement
{
private:
vector<double> values;
public:
vector<double> const & getStabLenght(void) const;
cBridge(void): valuest(int numberOfValues); //Hier wird die größe des Vektor an den übergeben
~cBridge(void);
};
Hier meine Implementierung:
Code: Alles auswählen
#include "cMeasurement.h"
using namespace std;
vector<double> const & cMeasurement::getValues(void) const;
{
return values;
}
cMeasurement::cMeasurement(void): values(int numberOfValues);
{
}
~cMeasurement::cMeasurement(void)
{
}
Muss ich nicht den Vektor values im Konstruktor erzeugen, weil die größe des Vektors values beim Konstruktoraufruf übergeben wird oder passt alles in der jetzigen Form ?
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 6:46 pm
von gizno82
Xin hat geschrieben:gizno82 hat geschrieben:Super das es Proggen.org gibt, hier bekommt man Hilfestellung von kompetenten Programmierern und wird nicht gleich mit dummen Kommentaren von inkompetenten leuten runter gemacht wie das bei manchen Foren der Fall ist.
Wenn Du ein kompetenter Programmierer bist, nicht einfach abhauen, sondern mithelfen. ^^
Hab auch nicht vor hier Wissen abzuschöpfen und dann nen Abgang zu machen. Ich würde auch mal gerne ein Tutorial schreiben, das andere weiter bringt, leider sind meine Kenntnisse was c++ angeht noch nicht sehr weit reichend wie Du siehst.
Ich komme aus dem c bereich, hab Mikrocontroller in c programmiert.
Über Mikrocontrollerprogrammierung könnte ich ein Tutorial machen.
Re: Pointer auf das erste Element eines vectors zurück geben
Verfasst: Mo Jan 09, 2012 6:53 pm
von Xin
gizno82 hat geschrieben:Wie muss ich vorgehen, wenn ich meinen Vektor Dynamisch erzeugen möchte.
Ein Vector ist dynamisch. Je mehr Messwerte Du speicherst, desto größer wird er.
gizno82 hat geschrieben:Sprich Den Benutzer fragen wie viele Messwerte er erfassen möchte die Eingabe in einer Integer Variable speichern,
Diese Variable dann beim Instanzieren der cMeasurement Klasse dem Konstruktor als Größenangabe für den Vektor values übergeben.
Ich denke das passt so, müsste ich aber selbst jetzt nachsehen.
Hier mal meine Klassendeklaration:[/quote]
Never ever using <class> oder using namespace in einer Headerdatei. Never!
Compilieren wird das nicht, aber das wird Dir der Compiler schon sagen.
gizno82 hat geschrieben:Muss ich nicht den Vektor values im Konstruktor erzeugen, weil die größe des Vektors values beim Konstruktoraufruf übergeben wird oder passt alles in der jetzigen Form ?
Du initialisiert den Vektor in der Initialisierungliste, die wird vor dem Konstruktor ausgeführt. Das ist a) der richtige und b) der beste Ort, um irgendwas zu initialisieren.
gizno82 hat geschrieben:Hab auch nicht vor hier Wissen abzuschöpfen und dann nen Abgang zu machen. Ich würde auch mal gerne ein Tutorial schreiben, das andere weiter bringt, leider sind meine Kenntnisse was c++ angeht noch nicht sehr weit reichend wie Du siehst.
Ich komme aus dem c bereich, hab Mikrocontroller in c programmiert.
Über Mikrocontrollerprogrammierung könnte ich ein Tutorial machen.
Keiner verlangt, dass Du gleich ein Tutorial schreibst, insbesondere dann nicht, wenn Du Dir mit den Informationen nicht sicher bist.
Mit Microcontrollerprogrammierung kannst Du Dich vermutlich mit cloidnerux zusammensetzen.