Estendere classe EthernetClient

Ciao a tutti, sto rendendo compatibile il codice del progetto Ardupower con Arduino 1.0, e ho bisogno d'aiuto per estendere la classe EthernetClient in modo che mi ritorni il numero del socket associato al client, nella vecchia versione ho copiato tutto il codice del Client e ho aggiunto la funzione

uint8_t Client::id () { return _sock; }

questa soluzione non mi piace perché in caso di modifiche della libreria ethernet non funziona più niente. Questa sera ho provato ad estendere la classe EthernetClient aggiungendo la funzione

uint8_t socketNumber () { return _sock; }

ma mi da l'errore

MyEthernetClient.cpp: In function 'uint8_t socketNumber()': MyEthernetClient.cpp:14: error: '_sock' was not declared in this scope

effettivamente la variabile è definita nella classe che estendo e non nella MyEthernetClient

Ho creato due files MyEthernetClient.cpp

extern "C" {
  #include "string.h"
}

#include "Arduino.h"

#include "Ethernet.h"
#include "EthernetClient.h"
#include "EthernetServer.h"
#include "Dns.h"
#include "MyEthernetClient.h"

uint8_t socketNumber () {
    return EthernetClient(_sock);
}

e MyEthernetClient.h

#ifndef myethernetclient_h
#define myethernetclient_h
#include "Arduino.h"    
#include "Print.h"
#include "Client.h"
#include "IPAddress.h"
#include "EthernetClient.h"

class MyEthernetClient : public EthernetClient {
  public:
    uint8_t socketNumber();
};

#endif

scopiazzando dall'EthernetClient. C'è qualcuno che mi può aiutare?

nel .h puoi evitare gli include, tranne quello a EthernetClient :-)

nel cpp stessa cosa, basta solo #include "MyEthernetClient.h"

purtroppo _sock è una variabile privata, quindi non la puoi utilizzare al di fuori della classe EthernetClient. Per essere utilizzata solo dalle sottoclassi, e non da altre parte del codice, dovrebbe essere dichiarata come "protected"

mi spiace ma non c'è soluzione al fatto di modificare manualmente la EthernetClient, tranne chiedere agli sviluppatorei dell'ide di rendere le variabili protected, o aggiungere una funzione get

Grazie, ho provato a modificare l'EethernetClient.h

....
private:
  static uint16_t _srcport;

protected:
  uint8_t _sock;
};

e a ricompilare ma mi da lo steso errore...

Sul numero di socket aperti mi pare di aver letto di una modifica del codice nella versione IDE 1.0.1 Bisognerebbe verificare. :cold_sweat:

Ho aperto una richiesta.

non si scrive

uint8_t socketNumber () {
    return EthernetClient(_sock);
}

ma

uint8_t MyEthernetClient::socketNumber () {
    return EthernetClient(_sock);
}