kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung

6.2 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 6.2-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 6.2-2: testemesswerte.cpp

testemesswerte.zip