Dynamisches Objekt aus Library erstellen - liefert Fehlermeldung



  • Hi,

    wohl mein erster Post hier 😃 Also Hallo an alle. Ich bastele seit geraumer Zeit an einer Arduino Bibliothek für ein Projekt. Leider weis ich nicht was ich falsch gemacht habe. Mittlerweile habe ich schon viele Tutorials und C++ Bücher bzgl. dieses Problems gewälzt. Aber ich finde immernoch nicht die Ursache bzw nicht die Lösung.

    Es soll duch eine Klasse mit zwei initialisierenden Argumenten dynamisch ein Objekt aus einer anderen Klasse des Headerfiles erstellt werden.

    Header File: wurst.h

    #include "Arduino.h"
    
    class wurst
    {
    public:
        wurst(int _pin, const char* _ad): dpin(_pin), typeAD(_ad){};
    protected:
        int dpin;
        const char* typeAD;
    
    };
    
    class salami: public wurst
    {
    public:
        salami(int _pin, const char* _ad): wurst(_pin,_ad)
        {
            pinMode(dpin, OUTPUT);
        };
        void go();
        void stop();
    
    };
    

    die zugehörige wurst.cpp

    #include "Arduino.h"
    #include "wurst.h"
    
    void salami::go()
    {
       /*....*/
        if(*typeAD == 'D')
            digitalWrite(driverpin, HIGH);
    
    }
    
    void salami::stop()
    {
       /*...*/
        if(*typeAD == 'D')
            digitalWrite(driverpin, LOW);
    
    }
    

    die folgende Klasse soll nun eine Instanz von salami erstellen:

    wurstbrot.h

    #include "Arduino.h"
    #include "wurst.h"
    
    class wurstbrot
    {
    public:
        wurstbrot(int _p, const char* _ad){
    
            salami *pSalami = new salami(_p,_ad);
        };
        void goWorkCycle(){
                pSalami->go();
            };
        void stopWorkCycle()
        {
            pSalami->stop();
        };
    };
    

    wenn ich nun Arduino das überprüfen lasse:

    #include "wurstbrot.h"
    
    wurstbrot lecker(13,"D");
    
    void setup()
    {  
    }
    
    void loop()
    {
     /* lecker.goWorkCycle();
      delay(100);
      lecker.stopWorkCycle();
      delay(100);*/
    }
    

    erhalte ich folgenden Fehler:

    In file included from wurstbrottest.cpp:1:
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h: In constructor 'wurstbrot::wurstbrot(int, const char*)':
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h:20: warning: unused variable 'pSalami'
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h: In member function 'void wurstbrot::goWorkCycle()':
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h:23: error: 'pSalami' was not declared in this scope
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h: In member function 'void wurstbrot::stopWorkCycle()':
    /Users/admin/CloudDocs/Projekte/Arduino/libraries/driver/wurstbrot.h:27: error: 'pSalami' was not declared in this scope
    

    [cpp]

    Ich verstehe leider nicht warum 😕

    Wäre super wenn einer von euch ein paar Gedanken dazu hat 👍

    Viele Grüße
    sicluceatlux

    P.S.: wenn ich stopWorkCycle() und goWorkCycle() herausnehme akzeptiert der compiler es. Jedoch will ich ja diese funktionen aber implementieren.



  • Der Fehler ist lächerlich einfach:

    wurstbrot(int _p, const char* _ad){ 
    
            salami *pSalami = new salami(_p,_ad);  ///pSalami ist eine  :warning:  scope-lokale  :warning:  Variable! Sie existiert nur im Konstruktor und ist außerhalb auch gar nicht sichtbar.
        }
    

    Was du willst, ist:

    class wurstbrot 
    { 
        salami *pSalami;
    
    public: 
        wurstbrot(int _p, const char* _ad):
        pSalami(new salami(_p,_ad))
        {} 
    
        void goWorkCycle(){ 
                pSalami->go(); 
            }; 
        void stopWorkCycle() 
        { 
            pSalami->stop(); 
        }; 
    };
    

    Übrigens: Wieso muss denn pSalami ein Zeiger auf ein Heap-Objekt sein? Was spricht gegen ein Stackobjekt?
    Edit: Also wieso nicht einfach

    salami Salami;
    


  • Werde es gleich mal testen :)!

    Da merkt man dass ich noch nicht all zu lange im oop bin ;).
    Genau deshalb zeigt es auf den Heap ich möchte mich etwas weiterentwickeln, was das Arbeiten mit Pointern etc. betrifft.

    Dachte mir schon fast dass es irgendwie etwas mit dem gültigkeitsbereich zu tun hat. Aber mir ist keine Lösung eingefallen bzw aufgefallen.

    Also vielen Dank! You made my day 👍

    Gruß
    sicluceatlux



  • sicluceatlux schrieb:

    Werde es gleich mal testen :)!

    Da merkt man dass ich noch nicht all zu lange im oop bin ;).

    Och, mit OOP hat das wenig zu tun.
    Schnapp dir ein Grundlagen-Buch, das ist immer gut 🙂



  • Hab ich bereits, aber wie gesagt bin neu und war so darauf fixiert, dass ich es im Konstruktor definieren muss, dass mir nicht aufgefallen ist das ich es über public, prot..... etc definieren müsste :S

    also nochmals thx...und werde natürlich nochmal die Grundlagen durchgehen 😉

    btw hat funktioniert.


Anmelden zum Antworten