IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Compilation de classe : erreur constructeur : "expected `)' before '=' token"


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Compilation de classe : erreur constructeur : "expected `)' before '=' token"
    Bonjour,

    Je tente de compiler une classe d'envoi d'emails via utilisation d'un socket.

    J'ai cependant ce message d'erreur lors de la compilation :
    expected `)' before '=' token
    , à la ligne où je déclare le constructeur de ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mail(ipSMTP="serveurmail.com", port=25)
    Je suspecte que le problème vienne des deux attributs de type string déclarés avant la méthode init de la classe :

    Voici le contenu de mail.h contenant la classe Mail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #if defined (WIN32)
        #include <winsock2.h>
        typedef int socklen_t;
    #elif defined (linux)
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <string>
    #include <iostream>
     
     
    using namespace std;
     
    class Mail
    {
          private :
     
          public :
                 SOCKET sock;
                 SOCKADDR_IN sin;
                 char buffer[255];
                 int erreur;
                 int port;
                 string message;
                 string ipSMTP;
     
                  Mail(ipSMTP="serveurmail.com", port=25)
                  {
                       #if defined (WIN32)
                        WSADATA WSAData;
                        erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
                         #else
                            erreur = 0;
                         #endif
     
                       message = "";
     
                       /* Création de la socket */
                        sock = socket(AF_INET, SOCK_STREAM, 0);
     
                        /* Configuration de la connexion */
                        sin.sin_addr.s_addr = inet_addr(ipSMTP.c_str());
                        sin.sin_family = AF_INET;
                        sin.sin_port = htons(port);
                  }
     
                  ~Mail()
                  {
                       /* On ferme la socket précédemment ouverte */
                            closesocket(sock);
     
                            #if defined (WIN32)
                                WSACleanup();
                            #endif
                  }
     
                  void envoi()
                  {
                       //Instructions d'envoi d'email par la socket via le SMTP
                  } 
    };
    Merci d'avance de votre aide !

    Niusha

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Tu te trompes en fait sur la manière d'utiliser un constructeur.
    Effectivement ça sert à initialiser les valeurs des membres de la classe, mais tu t'y prends très mal.
    Tu peux te faire un constructeur par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Mail()
    	:	ipSMTP( "serveurmail.com" )	// Initialisation des membres
    	,	port( 25 )
    {
    }
    Tu peux aussi faire un constructeur spécifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Mail( string const & p_ipSmtp, int p_port)
    	:	opSMTP( p_ipSmtp )
    	,	port( p_port )
    {
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Euh si c'est possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <string>
     
    class Mail
    {
    private :
    	int _port;
    	std::string _ipSMTP;
    public :
    	Mail(const std::string& ipSMTP="serveurmail.com", int port=25)
    	: _ipSMTP(ipSMTP), _port(port)
    	{
    	} 
    };
     
    int main() 
    {
    	Mail m ;
    	Mail m2("server", 123 );
    }
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Euh si c'est possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <string>
     
    class Mail
    {
    private :
    	int _port;
    	std::string _ipSMTP;
    public :
    	Mail(const std::string& ipSMTP="serveurmail.com", int port=25)
    	: _ipSMTP(ipSMTP), _port(port)
    	{
    	} 
    };
     
    int main() 
    {
    	Mail m ;
    	Mail m2("server", 123 );
    }
    Oui merci ta solution fonctionne ! Voici mon code après modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class Mail
    {
          private :
     
          public :
                 SOCKET sock;
                 SOCKADDR_IN sin;
                 char buffer[255];
                 int erreur;
     
                 string message;
     
                 string _ipSMTP;
                 int _port;
     
                 Mail(const string& ipSMTP="localhost", int port = 25)
                            : _ipSMTP(ipSMTP), _port(port)
                 {
                       #if defined (WIN32)
                        WSADATA WSAData;
                        erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
                         #else
                            erreur = 0;
                         #endif
     
     
                       // Création de la socket 
                        sock = socket(AF_INET, SOCK_STREAM, 0);
     
                        cout << "Creation de la socket. Serveur = " << ipSMTP.c_str() << "\n";
                        // Configuration de la connexion /
                        sin.sin_addr.s_addr = inet_addr(ipSMTP.c_str());
                        sin.sin_family = AF_INET;
                        sin.sin_port = htons(port);
                 }
     
                  ~Mail()
                  {
                       /* On ferme la socket précédemment ouverte */
                            closesocket(sock);
     
                            #if defined (WIN32)
                                WSACleanup();
                            #endif
                  }

  5. #5
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Je ne peux me retenir, il ne faut quasiment jamais utilisé de membre public.
    Ben oui mais pourquoi?
    Un exemple tu fais une classe avec un membre idx, tu l'utilise dans 147 de ton programme, et puis le client te dit mais moi je suis pas développeur mes index ne débute pas à 0 mais à 1. Soit tu fais 147 +1 dans ton code, mais la tu est tres con, soit tu change dans l'initialisation de l'index, mais dans ton code sa risque de mal se passer. Soit tu as fait un acceseur, et c'est trop de la bombe de balle et tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Bidon
    {
    private:
        int _idx ;
    public:
        int getIdx() const { return _idx+1; } //c beau non ?
        void setIdx(int idx) { _idx = idx - 1 ; }
    };
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Je ne peux me retenir, il ne faut quasiment jamais utilisé de membre public.
    Ben oui mais pourquoi?
    Un exemple tu fais une classe avec un membre idx, tu l'utilise dans 147 de ton programme, et puis le client te dit mais moi je suis pas développeur mes index ne débute pas à 0 mais à 1. Soit tu fais 147 +1 dans ton code, mais la tu est tres con, soit tu change dans l'initialisation de l'index, mais dans ton code sa risque de mal se passer. Soit tu as fait un acceseur, et c'est trop de la bombe de balle et tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Bidon
    {
    private:
        int _idx ;
    public:
        int getIdx() const { return _idx+1; } //c beau non ?
        void setIdx(int idx) { _idx = idx - 1 ; }
    };
    Oui je suis d'accord avec toi concernant la portée des attributs, ici je n'ai pas chercher à réfléchir mais effectivement je vais les passer en private ou protected et créer des getter et setter en cas de besoin.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,
    Citation Envoyé par niusha Voir le message
    Oui je suis d'accord avec toi concernant la portée des attributs, ici je n'ai pas chercher à réfléchir mais effectivement je vais les passer en private ou protected et créer des getter et setter en cas de besoin.
    Cette réflexion montre sans doute que tu as une très mauvaise idée de la manière de concevoir ton application d'un point de vue orienté objet...

    Tu sembles concevoir tes classes en fonction des membres qui les composent.

    Si c'est un point de vue on ne peut plus correct en conception "non orienté objet", c'est, malheureusement un point de vue totalement erroné (j'aurais meme tendance à dire "obsolète") lorsqu'il est question de concevoir une application dans une optique orientée objet.

    En effet, l'idée même de la conception orientée objet est de ne plus réfléchir en termes de donnée utilisées, mais en termes des services que tu peux attendre de la part des différentes classes que tu envisages d'utiliser.

    Les données membres ne doivent donc plus être envisagées sous la forme de l'ensemble des données qu'il faut utiliser pour représenter un type particulier, mais bien comme ce qui es nécessaire pour permettre à ta classe de fournir les services au tu en attends.

    En respectant ce principe, on se rend compte que l'utilisation d'accesseurs ou de mutateurs devient tout à fait marginale, la plupart des services offerts par la classes en prenant facilement la place

    Si tu respecte ce principe, et que tu respectes, en parallèle, le principe de la responsabilité unique, tu te rends compte que le fait de connaitre le serveur POP ou SMTP (ou le port sur lequel se connecter au serveur) ne fait pas partie des services que tu es en droit d'attendre de ta classe mail.

    Cette responsabilité devrait échoir à... la classe qui devra soit récupérer les mails soit les envoyer

    La moralité de cette histoire, c'est : commence par déterminer exactement quelle responsabilité tes classes doivent avoir, en veillant à ce qu'elle reste unique, détermine ensuite les services que tu es en droit d'attendre de ces classes.

    Les données qui permettront à tes classes de fournir les services attendus "tomberont" alors sous le sens, et ton design n'en sera que meilleur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,Cette réflexion montre sans doute que tu as une très mauvaise idée de la manière de concevoir ton application d'un point de vue orienté objet...

    Tu sembles concevoir tes classes en fonction des membres qui les composent.

    Si c'est un point de vue on ne peut plus correct en conception "non orienté objet", c'est, malheureusement un point de vue totalement erroné (j'aurais meme tendance à dire "obsolète") lorsqu'il est question de concevoir une application dans une optique orientée objet.

    En effet, l'idée même de la conception orientée objet est de ne plus réfléchir en termes de donnée utilisées, mais en termes des services que tu peux attendre de la part des différentes classes que tu envisages d'utiliser.

    Les données membres ne doivent donc plus être envisagées sous la forme de l'ensemble des données qu'il faut utiliser pour représenter un type particulier, mais bien comme ce qui es nécessaire pour permettre à ta classe de fournir les services au tu en attends.

    En respectant ce principe, on se rend compte que l'utilisation d'accesseurs ou de mutateurs devient tout à fait marginale, la plupart des services offerts par la classes en prenant facilement la place

    Si tu respecte ce principe, et que tu respectes, en parallèle, le principe de la responsabilité unique, tu te rends compte que le fait de connaitre le serveur POP ou SMTP (ou le port sur lequel se connecter au serveur) ne fait pas partie des services que tu es en droit d'attendre de ta classe mail.

    Cette responsabilité devrait échoir à... la classe qui devra soit récupérer les mails soit les envoyer

    La moralité de cette histoire, c'est : commence par déterminer exactement quelle responsabilité tes classes doivent avoir, en veillant à ce qu'elle reste unique, détermine ensuite les services que tu es en droit d'attendre de ces classes.

    Les données qui permettront à tes classes de fournir les services attendus "tomberont" alors sous le sens, et ton design n'en sera que meilleur
    Merci pour ces conseils, je vous montrerai le résultat final à l'occasion

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/08/2011, 09h22
  2. erreur: expected ‘)’ before ‘*’ token
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 12/10/2010, 21h24
  3. Réponses: 5
    Dernier message: 01/02/2010, 14h06
  4. "expected ';' before '(' token" étrange
    Par argonath dans le forum C++
    Réponses: 10
    Dernier message: 31/01/2010, 12h11
  5. Réponses: 1
    Dernier message: 21/03/2009, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo