Costrutore e initializer lists

Ragazzi sto impazzendo.
Sto cercando di fare una cosa relativamente semplice.

Ho una classe chiamata "MyWebServer", con dentro vari metodi, tra cui il costruttore, e una proprietà che dovrebbe puntare a AsyncWebServer

Qualcosa di sto tipo in un file .h:

#ifndef MYWEBSERVER_h
#define MYWEBSERVER_h

#include <ESPAsyncWebServer.h>

class MyWebServer {
  public:
    AsyncWebServer server;
    MyWebServer(int port) : server(port) {};
    void mioMetodo();

  private:    
};
#endif

con relativo file .cpp con il codice, grossomodo così:

#include <mywebserver.h>

WebServer::WebServer(int port) : server(port) {

}

void WebServer::mioMetodo() {
   this->server.begin();
}

Vorrei poterla inizializzare e richiamare in questo modo:

MyWebServer mywebserver(80);
mywebserver.mioMetodo();

dove in realtà 80 sarà preso da una costante salvata altrove, ma non la costante il problema.

Non riesco a creare la initializar list, ricevo svariati errori (tra cui una re-definizione di MyWebServer), sicuramente perchè la richiamo in maniera errata. qualcuno può darmi un pezzo di codice funzionante da usare come costruttore nel file .cpp ?

Per questo basta che togli la definizione di MyWebServer dal file .cpp, visto che già lo definisci nell' .h , oppure modifichi l' .h così:

MyWebServer(int port) ;

Ciao, Ale.

1 Like

Grazie.
sembra funzionare, non ricevo più errori in compilazione, ma sono perennemente incastrato con lo scope delle classi. Includo i 4-5 oggetti del progetto (è relativamente piccolo, ma molto compartimentato) nel file ino. Creo gli oggetti fuori da tutto, ad esempio:

MyWebServer mywebserver(80);

poi nel setup faccio l'init, come da esempio sopra.

Mi aspetterei, dato che l'oggetto mywebserver è stato creato fuori da tutto, fosse visibile ovunque, incluso nei file inclusi con altre classi, ma non è così.

Qualche sistema in c++/arduino per creare oggetti globali ?

A meno che, e mi andrebbe bene ugualmente, re-includere l'oggetto negli altri file, non faccia altro che ritornare il puntatore all'oggetto inizializzato dal main.ino, con tutto ciò che ne consegue. Una sorta di Singleton.

Vabbè, Arduino ci mette un po' del suo nell'incasinare le cose, comunque se nel tuo file incluso vuoi riferirti ad una variabile dichiarata globale nell' .ino principale, la keyword da usare è extern, es.:

Include "MyWebServer.h"

extern MyWebServer  MyServer; //ovviamente con il nome che usi

Così facendo stai appunto indicando al compilatore che esiste una variabile di quel tipo dichiarata altrove, l'associazione verrà fatta al momento del linking. Se il linker non trova la variabile avrai un errore alla fine della compilazione.

Ciao, Ale.

P.S.: leggi anche questa discussione, dove è stato affrontato un problema simile.

1 Like

Si, con extern sembra funzionare...

p.s: la discussione che hai linkato è la mia :wink:

Vedi come sono sveglio, vero... :crazy_face: :crazy_face:

Ciao, Ale.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.