[Anfänger] Probleme mit vector in einer Klasse



  • Hallo

    ich habe da ein Problem mit einen vector in einer Klasse.
    Der Vector soll ein struct aufnehmen

    In dieser Klasse mache ich viele Berechnungen, deren Zwischenergebnisse ich sammeln möchte und in einem Vektor speichern will. Speichern will ich ein struct.

    Hier die meiner Meinung nach wichtigen Codestücke

    **class zlh16.h[b]

    public:
        struct gas
          {
            int iGasNo;
            string sGasName;
            double dXN2;
            double dXHe;
            double dXO2;
          };
    
        struct deco_data_storage
          {
            double dXN2;
            double dXHe;
            double dDeltaTime;
            double dloadN2[16];
            double dloadHe[16];
          };
    private:
    
        std::vector<deco_data_storage> *vec_deco_data_storage;
    

    [b]class zlh16.cpp**

    zlh16::zlh16()
    {
      vec_deco_data_storage = new std::vector<deco_data_storage>;
    }
    
    zlh16::~zlh16()
    {
        delete[] vec_deco_data_storage;
    }
    
    void zlh16::vCalc_Tissue_Inert_Presure(float fDepth, gas *sActGas)
    {
      const int iNoOfComp=16;  //Festlegung auf 16 komparimente
      int iCompNo; //Zähler, zeigt akt Kompartiment an
      double dPpAmb = dGetActPresure(fDepth) - 0.0627; //0.0627 Wassdampfdruch@37C vergl baker et al
      deco_data_storage deco_data_storage_Temp; // Temp struct anlegn um Daten zwischenzuspeichern
      for (iCompNo = 0; iCompNo < iNoOfComp; iCompNo++)
        {
    
          //std::cout << "dPiN2  " << dPiN2[iCompNo] << "dPpAmb  " << dPpAmb << "sActGasO2  " << sActGas.dXO2 << endl;
          dPiN2[iCompNo] += (dPpAmb * sActGas->dXN2  - dPiN2[iCompNo]) * (1 - exp((-0.1667 / zlh16::t05N2[iCompNo]) * log(2)));
          dPiHe[iCompNo] += (dPpAmb * sActGas->dXHe  - zlh16::dPiHe[iCompNo]) * (1 - exp((-0.1667 / zlh16::t05He[iCompNo]) * log(2)));
          dPiSum[iCompNo] = dPiN2[iCompNo] + dPiHe[iCompNo];
          if (iCompNo==0)// Daten die sich je Durchgang nur einmal aendern nur einmal speichern
            {
              deco_data_storage_Temp.dDeltaTime=10;
              deco_data_storage_Temp.dXHe=sActGas->dXHe;
              deco_data_storage_Temp.dXN2=sActGas->dXN2;
            }
          deco_data_storage_Temp.dloadHe[iCompNo]=dPiHe[iCompNo];
          deco_data_storage_Temp.dloadN2[iCompNo]=dPiN2[iCompNo];
        }
      vec_deco_data_storage.push_back(deco_data_storage_Temp);
    }
    

    Das Ganze ergibt dann folgende Fehlermeldung... in Zeile 34

    error: request for member `push_back' in `((zlh16*)this)->zlh16::vec_deco_data_storage', 
    which is of non-class type `std::vector<zlh16::deco_data_storage, std::allocator<zlh16::deco_data_storage> >*'|
    

    Wo liegt das Problem? Google hat mich nicht wirklich weitergebracht..

    Danke

    Christian



  • Wenn du vec_deco_data_storage unbedingt als pointer haben willst, soltest du zum Memberzugriff auch "->" statt "." verwenden. Würd ich ehrlich gesagt nicht unbeding als pointer machen.

    Und was du im Destruktor machen willst gefällt mir auch gar nicht...
    (Verwchselst du da Array mit Vector? Lies idhc mal da bitte erst bissl schlau.)

    Grüße
    Franz



  • Hallo

    ich will das nicht umbedingt als Pointer, aber new gibt doch nunmal einen Pointer zurück. Die Daten müssen eine längere Gültigkeitsdauer haben als die Funktion, weil ich die daten anderswo noch weiterverarbeiten will.

    Das mit dem this hat funktioniert. Da Hatte ich etwas falsch verstanden...

    Wenn nicht mit new, wie bekomme ich denn die Gültigkeit vom vector über die Gültigkeit der funktion verlängert...



  • nordlichtHH schrieb:

    Hallo

    ich will das nicht umbedingt als Pointer, aber new gibt doch nunmal einen Pointer zurück. Die Daten müssen eine längere Gültigkeitsdauer haben als die Funktion, weil ich die daten anderswo noch weiterverarbeiten will.

    Grrr...
    Egal ob pointer oder objekt: Der Vektor ist ein Member und lebt so lange wie das zlh16-Objekt. Wenn du im Destruktor die Daten löschen willst sind sie ja auch futsch.
    Wenn du den vektor nicht als Pointer deklarierst, kannst du den Destruktor auch leer lassen.


  • Administrator

    franz schrieb:

    Grrr...

    Wir haben ein wildes Tier im Forum, holt den Tierarzt und das Betäubungsgewehr!

    *SCNR* 😃 🤡

    Grüssli



  • ok ok...

    jetzt seh ich auch wie blöd ich gedacht habe...

    Es ist für mich aber echt schwer "in Objekten" zu denken.
    Wenn ich erstmal so einen quatsch hinprogrammiert habe, dann sehe ich den Fehler nicht mehr und denke nicht mehr frei genug.

    Evtl ist auch das Programm was ich zu Übungszwecken schreiben will noch ein wenig zu hoch für mich.

    Ich hoffe es ist jetzt bei mir im Kopf angekommen.

    Danke

    Christian



  • Dravere schrieb:

    franz schrieb:

    Grrr...

    Wir haben ein wildes Tier im Forum, holt den Tierarzt und das Betäubungsgewehr!

    *SCNR* 😃 🤡

    Schnell, sonst paart es sich noch mit einem der vielen Trolle hier im Forum.. 🙂



  • drakon schrieb:

    Dravere schrieb:

    franz schrieb:

    Grrr...

    Wir haben ein wildes Tier im Forum, holt den Tierarzt und das Betäubungsgewehr!

    *SCNR* 😃 🤡

    Schnell, sonst paart es sich noch mit einem der vielen Trolle hier im Forum.. 🙂

    franz schrieb:

    Grrr...

    Um das nicht noch mal schreiben zu müssen 😃

    // edit:
    okok, um die Jugendfreiheit hier im Forum zu gewährleisten:
    Das war ein spontaner Lautausstoß, um mich in friedlicher Art und Weise meiner angestauten Frustration ob der Lesehemmschwelle guter Grundlagebücher zum Thema C++ zu entledigen, nicht aber die vor Lust wobende intime Erregung im Anblick des doch sehr verführerischen Gedankenspiels des Liebesaktes mit einem Troll oder Tierarzt samt - Gewehr...

    franz schrieb:

    Grrr...


Anmelden zum Antworten