[programation] Probleme d'heritage de classe EthernetClient

bonjour , voila je patine dans la semoule et je ne comprend pas pourquoi la compile bloque!

ce que je cherche a faire c'est cree une classe qui herite de la classe EthernetClient pour ajouter des nouvelle methode a cette meme classe( si pas claire je réexplique).
dans l'idée je fait cela:

class ReptilduinoClient:public EthernetClient{
    public:
        ///constructeur
  ReptilduinoClient();
       ///Methode
 // cette fonction permet d'analyse une requete de type get et d'en extraire les clefs et les valeur elle retourne true si une autre valeur est trouvé ainsi que deux pointeur
     boolean analyseGet(char *ptr_name, char *ptr_valeur);
    private:
        ///Atribut
       };

normalement ma classe herite de tout la class Ethernetclient non ?

or quand je cherche a utiliser avec ce qui suit :

EthernetServer server(80);
//EthernetClient client ;
ReptilduinoClient client;

void loop(){
client = server.available();}

je me fait jeté pr la compile avec ce message :

monWebServer.ino: In function 'void loop()':
monWebServer:65: error: no match for 'operator=' in 'client = EthernetServer::available()()'
D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\reptilduino_server/reptilduino_server.h:26: note: candidates are: ReptilduinoClient& ReptilduinoClient::operator=(const ReptilduinoClient&)

or je ne comprend pas ce qui plante et je ne trouve rien sur un" opperateur="
si un geni de la prog ou quelqu'un a une idee !
merci! :smiley:

As-tu défini une méthode de copie qui reçoit un EthernetClient& comme paramètre ? Ou un copy constructor ayant un EthernetClient& comme paramètre ?

Apparemment pas, et C++ doit savoir que faire. Tu ne peux pas copier un parent dans un enfant, car il faut savoir que faire des attributs de l'enfant, et il n'y a pas de traitement par défaut pour cela.

Une autre option : si EthernetClient est déclarée dynamique (avec des "virtual"), tu peux définir une référence ou un pointeur vers un EthernetClient, et utiliser le polymorphisme (ce que tu veux faire, en fait).
Sans cela, tu ne pourras jamais faire ce que tu veux. Le polymorphisme ne fonctionne que via des pointeurs.

javous ne pas comprendre ta reponse ( manque de connaissance?) , et du coup je ne voi pas comment faire !

normalement meme si ma class ne contenai rien elle possede bien tout les atributs et metodes de la class Ethernetclient (dont elle herite) donc elle devrait fonctionné directe non ? ou alors tout n'est pas copier?
car lors de la construction de mon objet ReptilduinoClient client le premier constructeur appelé est bien celui de la classe parente et donc de EthernetClient non?

merci

Hello,

C++ rouspète car il faut copier un parent dans un enfant. Or, ce genre d'opération n'est pas autorisée, tu dois définir toi-même l'opération en définissant un opérateur de copie ou un constructeur par copie.

Si tout cela te dépasse, tu devras apprendre au préalable les bases du C++, sur le site du Zéro par exemple :wink:

c'est peut'etre moi qui pige pas mais normalement le constructeur de copy ou dans mon cas plutot un probleme dopperateur d'affectation sont créé automatiquement par le compilateur non?
cf:http://fr.openclassrooms.com/informatique/cours/programmez-avec-le-langage-c/le-constructeur-de-copie-2

Oui, dans le cas de la même classe.

Or, ici, la classe "server" renvoie un "parent" et C++ ne sait quoi en faire par rapport à un "enfant"
Dans le lien donné, tu n'as pas un "Personnage" en entrée...

ok j'ai piger je pense donc je vais essayer d'ecrire ce quil faut !
merci

bon j'ai retourné le probléme dans tout les sens et a chaque foi je me retrouve avec :

D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\Ethernet/EthernetClient.h:33: error: 'uint16_t EthernetClient::_srcport' is private
D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\reptilduino_server\reptilduino_server.cpp:27: error: within this context
D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\Ethernet/EthernetClient.h:33: error: 'uint16_t EthernetClient::_srcport' is private
D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\reptilduino_server\reptilduino_server.cpp:27: error: within this context

des que j'esaye de copier les atribut de la class mere a la classe fille , je ne suis pas sur que je puise le faire car dans la lib ethernetclient les atribut sont sous la porte PRIVATE et pas PROTECTED , est ce que ça ne viendrai pas de la par hazard?

Passe par un copy constructor :

class enfant : public parent
{
        enfant(parent &val) : parent(val) {}
};

=( je n'y a arrive pas !!

j'ai ecri cela mais ça ne compile pas:
le .h

class ReptilduinoClient:public EthernetClient
{
public:
    ///constructor
    ReptilduinoClient();
    ReptilduinoClient(EthernetClient &clientACopier);
       ///Methode
private:
    ///Atribut
  };

le .cpp

///class ReptileduinoClient:
///constructeur:
ReptilduinoClient::ReptilduinoClient(){}
ReptilduinoClient::ReptilduinoClient(EthernetClient &clientACopier):EthernetClient(clientACopier){}

ha je croit que je tien le bon bout , en tout cas sa bloque plus ou j'etait

code .h

class ReptilduinoClient:public EthernetClient
{
public:
    ///constructor
    ReptilduinoClient();
    ReptilduinoClient( const EthernetClient &);
    //ReptilduinoClient(EthernetClient &clientACopier):EthernetClient(clientACopier){};
       ///Methode
private:
    ///Atribut

    //EthernetClient*m_client;
};

code.cpp

///class ReptileduinoClient:
///constructeur:

ReptilduinoClient::ReptilduinoClient(){}
ReptilduinoClient::ReptilduinoClient( const EthernetClient &){}

oui, il faut ajouter const au paramètre en référence. Au temps pour moi

bon j'ai essayer hier soir ça compile bien mais ça ne fonctione pas , je dirai que la conection ne ce fait pas , comme je n'ai pas la posibilité de tester pour le moment je cherche d'où cela peut venir, est je me demander si il ne me falai pas un autre constructeur de copie qui recevrai l'objet ethernetclient que renvoi la fonction server.aivailable() car si je comprend bien elle renvoi un objet qui apele le constructeur de ethernetclient suivant :

EthernetClient(uint8_t sock);

du coup je me suis dit qu'il falait faire un constructeur de copie qui appelai le bon constructeur ( :~ la je ne suis vraiment pas sur de moi)
donc j'ai ecrit cela est bizarement je me suis pas fait jeté lors de la compile mais je ne sait pas si :
1- c'est correcte
2-cela va marché

bref voila le code :

//dans le header :
ReptilduinoClient( const EthernetClient &Client(uint8_t ));
//dans le cpp
///constructeur de copie
ReptilduinoClient::ReptilduinoClient( const EthernetClient &Client(uint8_t)){}

dans ma tete voila ce que je comprend
"on copie un objet ethernetclient qui s'initialise avec une variable de type uint8-T "
voila pour le moment je n'avance plus , toute aide ( ou insulte si je bafou la sainte ecriture c++) sera la bien venue

hello, ton parent ne prend pas la valeur de &Client.

Tu dois ajouter " : EthenetClient(Client) {}" dans ton constructeur de copie.

///constructeur de copie
ReptilduinoClient::ReptilduinoClient( const EthernetClient &Client(uint8_t)): EthenetClient(Client) {}

Comme ça ?
si j'ai pas compris , tu veu bien dévelopé stp?

Oui. Pour le reste, je ne peux pas expliquer aussi bien que les tutoriels qui existent déjà :wink:

merci beaucoup pour ton aide c'est deja pas mal , a vrai dir j'ai meme acheter les bouquin du site du zero mais comme je par de zero en programation (j'entant par la que c'est pas mon domaine d'activité ou d'etude) , et bien y'a des truc qui sont pas forcement evident a comprendre donc meme en me baladant de tuto en boukin et j'en passe , bin je bloque!
en tout cas merci je testerai ce soir !

zut ça compile plus j'ai ce message d'erreur :

D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\reptilduino_server\reptilduino_server.cpp: In constructor 'ReptilduinoClient::ReptilduinoClient(const EthernetClient& (*)(uint8_t))':
D:\Arduino\programe arduino\arduino-1.0.5-windows\arduino-1.0.5\libraries\reptilduino_server\reptilduino_server.cpp:19: error: class 'ReptilduinoClient' does not have any field named 'EthenetClient'

aurais tu la possibilité de m'ecrire le constructeur de copie car la j'avoue que je sait plus je comprend plus rien !
je sait plus ou il faut mettre quoi !

autre question est ce que l'on est obligé d' ecrire l'operateur d'affectation!

je sens que je vais abandoné et simplement repasser par une classe prend comme atribut un objet Ethernetclient je trouve ça moins propre mais vue que j'y arrive pas !
:~

Lis le message d'erreur, c'est explicite : tu as fait une faute de frappe.

Je n'ai pas compris l'utilité d'hériter de la classe EthernetClient comme tu veux le faire. En quoi est-ce "propre" ?

Si tu veux la manipuler, instancie un EthernetClient quelque part (dans une fonction, une clase, peu importe) et utilise-le simplement.

Hériter d'une classe est utilie uniquement si tu veux te substituer à un EthernetClient en ajoutant ou en remplaçant des fonctionnalités, tout en étant "transparent" pour les utilisateurs de ta classe (polymorphisme). Mais si c'est juste pour utiliser une connexion Ethernet, utiliser une classe de base suffit amplement, et c'est propre :wink: