Werte aufnehmen, als vector speichern und in Klasse verpacken





  • so noch mal einen alten Thread aufgreifen. Habe es ohne Kopierkonstruktor gemacht, da
    1. meine member bitweise kopiert werden dürfen (sind ja keine Zeiger)
    2. meine Klasse keine Attribute enthält, die mit dem Schlüsselwort __property zugänglich gemacht werden müssen.

    funktionieren tut es so auch. Hier mal meine Code. Da ich noch keine Messwerte habe, habe ich einfach random-werte aus der rand() - Funktion genommen. Später kommen die Werte als String (aber das kann ich ja mit StrToFloat an den Konstruktor übergeben). Was meint ihr zu der Lösung? Kann ich die Klasse so einsetzen oder gibts evtl Verbesserungsvorschläge?

    // Headerdatei der Klasse:
    #ifndef c_MesswerteH
    #define c_MesswerteH
    class c_Messwerte
    {
    	private:
          double m_drehzahl;
          double m_drehmoment;
       public:
    		c_Messwerte(double p_n = 0.0, double p_m = 0.0);
            double GetDrehzahl(void)const;
            double GetDrehmoment(void)const;
    };
    #endif
    
    // cpp-Datei der Klasse:
    #include <vcl.h>
    #pragma hdrstop
    #include "c_Messwerte.h"
    #pragma package(smart_init)
    
    c_Messwerte::c_Messwerte(double p_n, double p_m)
    	: m_drehzahl(p_n), m_drehmoment(p_m) {}
    double c_Messwerte::GetDrehzahl(void)const
    {
    	return m_drehzahl;
    }
    double c_Messwerte::GetDrehmoment(void)const
    {
    	return m_drehmoment;
    }
    
    //cpp Datei der Form1:
    #include <vcl.h>
    #pragma hdrstop
    #include "HO.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TF_HO *F_HO;
    
    //---------------------------------------------------------------------------
    __fastcall TF_HO::TF_HO(TComponent* Owner)
    	: TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    
    void TF_HO::ErfasseMesswerte(const int AnzahlMesswerte)
    {
    	c_Messwerte o_Messwerte(rand(), rand());
    	v_Messwerte.reserve(AnzahlMesswerte);
    	v_Messwerte.push_back(o_Messwerte);
    }
    

    Die Funktion ErfasseMesswerte hab ich als Methode der Form1 (hier F_HO). Macht man das so? Kann ich die Vetordeklaration auch mit in die F_HO-Klasse schreiben?

    // header der F_HO (Form1)
    #ifndef HOH
    #define HOH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "c_Messwerte.h"
    #include <vector>
    //---------------------------------------------------------------------------
    class TF_HO : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
       std::vector<c_Messwerte>v_Messwerte;
    public:		// Anwender-Deklarationen
    	__fastcall TF_HO(TComponent* Owner);
    	void ErfasseMesswerte(const int AnzahlMesswerte);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TF_HO *F_HO;
    //---------------------------------------------------------------------------
    #endif
    

    ich hab auch mal die Bezeichnung geändert also o für Objekt, v für Vektor, c für Klasse, m für member. Dann blick ich auch eher durch wenns mehr Quellcode wird 😉
    Kann ich zum Auslesen der Werte (sollen später in eine Datei gespeichert werden und angeszeigt werden) die GetMethode nehmen. Habe gelesen, dass man den Zugriff auf private member über methoden vermeiden sollte. Oder macht man das anders?



  • Hallo,

    Das kann man schon so machen.
    Das mit den Prefixen vor den Bezeichnern halte ich eher für keine gute Idee aber das ist Ansichtssache. Google da mal nach Ungarische Notation.
    Der Parameter bei ErfasseMesswerte muss nicht const sein da der ja sowieso kopiert wird.



  • hab mir grad mal die ungarische Notation angesehen. Da muss man sich aber auch erst mal dran gewöhnen. Da müsst ich meine ganzes Programm ändern was ziemlich umständlich sein dürfte, da der Borland Builder 5 glaub ich keine Suchen/Ersetzen-Funktion hat.



  • Hallo

    Braunstein wollte sicher nicht, das du jetzt komplett auf Ungarische Notation umsteigst. Sondern er wollte sicher dich darauf hinweisen, das deine Präfixe bereits an die Ungarische Notation erinnern, und das in der Entwicklergemeinde die Vor- und Nachteile dieses Benennungsstiles sehr kontrovers diskutiert werden.
    Braunstein will eigentlich nur sagen, das er selber deine Präfixe schlecht findet. Aber du darfst deine Variablen in deinem Programm so nennen wie du willst 😉

    bis bald
    akari



  • Genau das wollte ich sagen.
    Dank für die Übersetzung akari. 😉


Anmelden zum Antworten