Implemetierung und Test der Klasse Messwerte
Die Klasse Messwerte läßt sich ganz gut mit Hilfe der Klasse vector implementieren.
Speicherverwaltung
Bei der Methode toArray() muss darauf geachtet werden, dass der zurückgegebene Zeiger
auch wirklich auf ein existierendes double-Array zeigt.
Aus diesem Grund wird in dieser Methode mit new
Speicherplatz für das
Array angelegt. Mit new
angelegter Speicherplatz bleibt erhalten, auch
wenn die Methode, in der das passiert, längst wieder verlassen wurde. Dagegen
dürfte auf gar keinen Fall ein Zeiger auf ein Array der Art int x[100];
aus einer Methode heraus zurückgegeben werden. Dieser Stack-Speicherbereich wird
wieder freigegeben, wenn die Methode verlassen wird.
Ein neues double-Array muss gebildet werden,
wenn zwischen zwei Aufrufen der Methode toArray()
weitere Messwerte hinzugekommen sind.
Wird bei wiederholtem Aufruf von toArray() eine gewachsene Anzahl an Messwerten in
einem neuen Speicherbereich abgelegt, so geht derjenige vom letzten Aufruf nicht
verloren. Er könnte nur mit delete()
wieder freigegeben werden.
Mit der Lebensdauer von Objekten werden wir uns im nächsten Kapitel (8 Fabrikmethoden) noch näher beschäftigen.
Ob die Speicherverwaltung tatsächlich funktioniert, wird mit Hilfe der main-Methode in testemesswerte.cpp ausprobiert.
#include<vector> using namespace std; class Messwerte { public: vector<double>* messwerte; bool aktuell; Messwerte() { messwerte = new vector<double>(); } void add(double wert) { messwerte->push_back(wert); aktuell = false; } double* toArray() { double* werte = new double[messwerte->size()]; for(int i=0;i<messwerte->size();i++) werte[i] = messwerte->at(i); aktuell = true; return werte; } int getSize() { return messwerte->size(); } };
Code 0-1: Messwerte.h
#include<iostream> #include "Messwerte.h" using namespace std; int main(void) { Messwerte meineMessungen; meineMessungen.add(1.0); meineMessungen.add(7.0); meineMessungen.add(3.2); meineMessungen.add(1.5); int anzahlA = meineMessungen.getSize(); cout<<"AnzahlA="<<anzahlA<<endl; double* werteA = meineMessungen.toArray(); for(int i=0;i<anzahlA;i++) cout<<"WertA Nr."<<i<<": "<<werteA[i]<<endl; meineMessungen.add(-300.0); meineMessungen.add(-150.0); int anzahlB = meineMessungen.getSize(); cout<<"AnzahlB="<<anzahlB<<endl; double* werteB = meineMessungen.toArray(); for(int i=0;i<anzahlB;i++) cout<<"WertB Nr."<<i<<": "<<werteB[i]<<endl; werteB[0] = -1000.0; cout<<"werteB[0] = -1000.0"<<endl; for(int i=0;i<anzahlA;i++) cout<<"WertA Nr."<<i<<": "<<werteA[i]<<endl; for(int i=0;i<anzahlB;i++) cout<<"WertB Nr."<<i<<": "<<werteB[i]<<endl; }
Code 0-2: testemesswerte.cpp