Class frage "cannot call constructor directly"

Hallo zusammen,

Ich habe mir eine Klasse programmiert wo ich auf eine weitere zugreifen will. Mir ist nicht klar wie und wo ich das tu.
Wenn ich das so programmiere wie unten bekomme ich die Fehlermeldung “cannot call constructor directly”

Actor.h

#include "NewRemoteTransmitter.h"

class Actor {

private:
    unsigned long id;
    int unit;
    bool state;
	
public:
    Actor(unsigned long i, int u);
	
    void toggle() {
    	const int pin = 11;
    	const unsigned int delay = 260;
    	const byte repeat = 3;
        if ( !state ) {
            state = true;
            NewRemoteTransmitter::NewRemoteTransmitter(id, pin, delay, repeat).sendUnit(unit, 1);
        }
        else {
            state = false;
            NewRemoteTransmitter::NewRemoteTransmitter(id, pin, delay, repeat).sendUnit(unit, 0);
        }
    }
};

Actor.cpp

#include "Actor.h"

Actor::Actor(unsigned long i, int u = 0) {
    id = i;
    unit = u;
    state = false;
}

Sketch

#include <Arduino.h>

Actor Living1(7402746, 0);
void loop() {
	Living1.toggle();
	Living1.toggle();
}

Über gib das Objekt per Constuctor Injection, oder per Setter Injection.
Sieh dazu: "Dependency Injection Design Pattern"

Alternativ: Lege das NewRemoteTransmitter Objekt global (Singleton) an.
Das ist vermutlich besser, als eine dynamische Speicherverwaltung. Das geht auf µC zu schnell ins Auge.

Diese Art des Aufrufs geht nur mit statischen Methoden. Ansonsten muss erst mal ein Objekt existieren auf dem man die Methode aufruft.

Ich habe die Lösung hier bekommen:

Einfach "NewRemoteTransmitter::" weglassen und es geht :-), so einfach!

Das erstellt aber nur ein temporäres Objekt. Eine tolle Lösung ist das nicht unbedingt.

Das "kann" berechtigt/beabsichtigt sein.
Hat aber meist wenig Sinn!

Was mich hier stutzig macht, ist die Verwechselung zwischen Objekt und Klasse.
Ich habe gelernt dazwischen STRENG zu unterscheiden.
In diesem Thread verwischt das.....

Ziel meiner Klasse ist das ich ein Actor mit wenig aufwand initialisieren kann, daher find ich das so ganz praktisch.
Ich möchte auch noch weitere Funktionen hinzufügen um zum Beispiel den Status des Actors zu ändern.

@combie und @Serenifly
Wenn Ihr das nicht gut findet könnt Ihr mir doch bitte ein Beispiel geben wie ich das besser machen kann :slight_smile:

Ich würde ja gerne...

Was ist "NewRemoteTransmitter"?
Was ist ein "Actor"?

Super :slight_smile:

Ein Actor und ActorOLD ist eine Funksteckdose, Remote Transmitter ist ein 433MHz Library die mit meinen Actoren zusammen arbeitet.

Mein aktueller code auf Bender:

https://codebender.cc/sketch:216062#Marc_IT_New.ino

#include <NewRemoteTransmitter.h>

NewRemoteTransmitter transmitter(123, 11, 260, 3);

class Actor {

private:
    unsigned long id;
    int unit;
    bool state;
	
public:
    Actor(unsigned long i, int u);
	
    void toggle() {
    	const int pin = 11;
    	const unsigned int delay = 260;
    	const byte repeat = 3;
        if ( !state ) {
            state = true;
            transmitter.sendUnit(unit, 1);
        }
        else {
            state = false;
            transmitter.sendUnit(unit, 0);
        }
    }
};

nur geraten