Klassenvariable mit Parametern im Konstruktor



  • Servus,

    ich bin gerade dabei, meine ersten Schritte mit C++ für AVR Controller zu machen und bin auf eine Problem gestoßen:

    Ich würde gerne die angeschlossene Peripherie als Klassenvariablen anlegen und im Konstruktor der Hardware zuweisen (siehe erstes Codebeispiel Zeile 31). Leider bekomme ich eine Fehlermeldung vom Compiler (ich benutze AVR Studio 6 und den gcc Compiler)

    Wenn ich die Variable direkt in der main() anlege, funktioniert es und die LED auf meinem Board leuchtet (siehe zweites Codebeispiel).

    Warum kann ich ich Klassenvariablen keine Konstruktoren mit Parametern verwenden?

    Ich weiß das hier ist kein AVR Forum, aber ich denke das beschriebene Problem ist ein generelles C++ Problem. Vielleicht kann mir ja jemand helfen. Vielen Dank schonmal 🙂

    #define F_CPU 8000000
    #define MCU AT90USB1286
    #include <avr\io.h>
    
    class LED
    {
    	public:
    	void init()	{*(&port - 1) |= (1 << bit); off();}
    	void on()	{port &= ~(1 << bit);}
    	void off()	{port |= (1 << bit);}
    	LED(volatile uint8_t & port_temp, unsigned char bit_temp) : port(port_temp), bit(bit_temp) { }
    	~LED() { }
    
    	protected:
    	volatile uint8_t& port;
    	unsigned char bit;
    };
    
    class Controller
    {
    	public:
    	void main()
    	{
    		LED_Red.init();
    		LED_Red.on();	
    	}
    	Controller()  { }
    	~Controller() { }
    
    	protected:
    	LED LED_Red(PORTA,7);       //  Das funktioniert so nicht
    
    };
    
    Controller app;
    
    main (void)
    {
    app.main();
    }
    
    ...
    
    class Controller
    {
    	public:
    	void main()
    	{	
    		LED LED_Red(PORTA,7);       //  Das funktioniert
    		LED_Red.init();
    		LED_Red.on();	
    	}
    	Controller()  { }
    	~Controller() { }
    };
    
    Controller app;
    
    main (void)
    {
    app.main();
    }
    


  • Nimm die Konstruktor-Initialisierungsliste:

    Controller::Controller()
    : LED_Red(PORTA,7)
    {
    }
    

    Leere Defaultkonstruktoren und Destruktoren musst du übrigens nicht definieren.



  • Im oberen Listing versuchst du eine Methode zu deklarieren und nutzt 7 als Typ, was natürlich nicht geht...
    Im unteren Listing erstellst du eine neue Instanz von LED und rufst den Konstruktor auf.
    Ich weiss nicht ganz was die beiden Listings miteinander zu tun haben...



  • Hallo Nexus,

    vielen Dank für den Tipp, so funktioniert es.

    @ MarcoYolo: Ich wollte im Oberen Listing keine Methode deklarieren. Zugegebenermaßen sieht es von der Synthax so aus. Das was ich eigentlich wollte ist das, was es jetzt tut:

    class Controller
    {
    
    	public:
    	void main()
    	{	
    
    		LED_Red.init();
    		LED_Red.on();	
    	}
    	Controller()  : LED_Red(PORTA,7) { }
    
    	protected:
    		LED LED_Red;
    
    };
    

Anmelden zum Antworten