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 :

[debat] paramètres au construceur ou methode init?


Sujet :

C++

  1. #1
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [debat] paramètres au construceur ou methode init?
    Bonjour à tous,

    j'ai créé un certain nombre de classe ces derniers temps, et à chaque fois que je créé une nouvelle classe, je me pose la question:
    "est-ce que je met tout un tas de paramètres dans le constructeur ou est-ce que je ne fais qu'un constructeur par défaut et je créé une méthode d'initialisation pour ma classe?"

    Exemple: je fais ça
    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
     
    classe MaClasse
    {
    public:
      MaClasse(int val1, int val2, string leNom);
     
    private:
      int m_valeur1,m_valeur2;
      string m_leNom;
    }
     
    MaClasse::MaClasse(int val1, int val2, string leNom)
    {
      m_valeur1 = val1;
      m_valeur2 = val2;
      m_leNom = leNom;
    }
    ou ça?
    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
     
    classe MaClasse
    {
    public:
      MaClasse();
      void init(int val1, int val2, string leNom);
     
    private:
      int m_valeur1,m_valeur2;
      string m_leNom;
    }
     
    MaClasse::MaClasse(){}
     
    void MaClasse::init(int val1, int val2, string leNom)
    {
      m_valeur1 = val1;
      m_valeur2 = val2;
      m_leNom = leNom;
    }
    Dans quel cas utiliser quelle méthode? Qu'en pensez-vous?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    moi je ferais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    public:
      MaClasse(int val1, int val2, string leNom);
    ...
     
      MaClasse::MaClasse(int val1 = 0, int val2 = 0, string leNom = "")
    : m_valeur1(val1),  m_valeur2(val2),  m_leNom(leNom)
    {
    };
    je pense que c'est plus efficace, il n'y a qu'un appel au constructeur.
    (pour les valeurs par défaut tu mets ce que tu veux bien sur)

  3. #3
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    je ne vois pas l'intérêt de ta méthode init() :
    - le constructeur sert entre autre à initialiser les attributs;
    - si tu veux modifier tes attributs après construction, crée des accesseurs.

    enfin, il me semble que c'est comme ça que l'on fait...

  4. #4
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bigboomshakala
    moi je ferais ça

    Code:
    ...
    public:
    MaClasse(int val1, int val2, string leNom);
    ...

    MaClasse::MaClasse(int val1 = 0, int val2 = 0, string leNom = "")
    : m_valeur1(val1), m_valeur2(val2), m_leNom(leNom)
    {
    };
    Dans ce cas, est-ce que je peux déclarer un tableau de MaClasse comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Classe UneAutreClasse
    {
    ...
    MaClasse monTableau[10];
    };
    ?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    oui bien sur, dans ce cas les attributs des objets MaClasse du tableau prennent leur valeur par défaut

    i.e. m_valeur1 = 0, m_valeur2 = 0 et m_leNom = ""

    car le constructeur appelé est MaClasse(0,0,"") étant donné que tu ne passes pas de paramètres

  6. #6
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ok, et bien en effet, il n'y a aucun intérêt à faire un init.

    Merci.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour les problèmes de tableaux / constructeurs, ne pas oublier que std::vector permet d'avoir des tableaux de classes ne possédant pas de constructeur par défaut .

  8. #8
    r0d
    r0d est actuellement connecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ha!! J'ai trouvé un exemple où ça peut-être intéressant d'avoir un init():

    J'ai deux classes MaClasse1 et MaClasse2. MaClasse2 est une agregation de MaClasse1, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class MaClasse2
    {
    ...
    MaClasse1 monTableau[10];
    ...
    }
    Dans mon programme, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaClasse1 *p1 = new MaClasse1();
    MaClasse2 c1; //ici, le tableau c1.MonTableau est alloué
    for (int i=0; i<10; i++)
    {
       c1.MonTableau[i].init(<mes paramètres>);
    }
    Dans ce cas, je ne peux pas mettre un new dans ma boucle! Qu'en pensez-vous?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Dans ce cas, tu ne fais que remplir ton tableau avec des données, donc le nom de la fonction init n'est pas très bien choisi, à mon avis:
    c'est un simple accesseur, donc un nom comme Setxxxx serait plus clair que init, qui pour moi implique des opérations autres que simplement mettre à jour des valeurs.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par r0d
    Ok, et bien en effet, il n'y a aucun intérêt à faire un init.

    Merci.
    Moi j'en connais au moins un interêt. Si le code d'initialisation peut déclencher des exceptions.

    En effet tu ne peux pas faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
          MaClasse obj(...);
    }
    catch(...)
    {
       // ...
    }
    Parce'que alors ta variable obj n'a pour portée que le bloc try{} ce qui est embêtant.
    Alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MaClass obj;
    try
    {
         obj.init(...);
    }
    catch(...)
    {
          // ...
    }
    Ca va mieux J'avais déjà posé la question ici et il s'avère qu'il n'y a pas de solution hormis celle-là.

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    A quoi sert ton objet si tu n'as pas pu l'initialiser à l'état désiré ?

    Sinon, de façon tordue, il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ObjS o;
    try { 
        ObjS o2("toto"); 
        o2.swap(o); // je ne sais plus si on peut faire ça en une ligne
     
        o = ObjS("titi");
    }....
    Concernant les tableaux, Loulou24 a donné la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct ObjI {
        ObjI(int);
    private:
        ObjI(); // constructeur par défaut interdit
        ....
    };
    ...
    std::vector<ObjI> v;
    for (int i=0 ; i!=10 ; ++i)
        v.push_back( ObjI(i) );
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Luc Hermitte
    A quoi sert ton objet si tu n'as pas pu l'initialiser à l'état désiré ?
    A rien mais il faut pouvoir gérer le cas où ca ne marche pas. Dans le premier cas même si ca réussi il est détruit à la fin du bloc .. c'est embêtant.
    Citation Envoyé par Luc Hermitte
    Sinon, de façon tordue, il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ObjS o;
    try { 
        ObjS o2("toto"); 
        o2.swap(o); // je ne sais plus si on peut faire ça en une ligne
     
        o = ObjS("titi");
    }....
    Je préfère ma fonction init(), plus clair à mon avis.

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Avec une construction normale, si ça foire, tu n'as pas d'objet créé et tu sors du bloc, sinon tu as un objet construit qui sera détruit à la fin du bloc.

    Si l'objet ne sert à rien, pourquoi s'embéter à le vouloir ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Luc Hermitte
    Avec une construction normale, si ça foire, tu n'as pas d'objet créé et tu sors du bloc, sinon tu as un objet construit qui sera détruit à la fin du bloc.

    Si l'objet ne sert à rien, pourquoi s'embéter à le vouloir ?
    Oui mais j'ai pas spécialement envie de faire tout mon code lié à mon objet créé dans le bloc try{ }

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    ???

    Autre question : es-tu sûr que tu traites l'erreur à l'endroit où elle doit l'être ? (la question cachée dans la question se résume à "profites-tu du RAII?")
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Luc Hermitte
    ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try
    {
        maclass obj(...)
     
        // je dois mettre tout le code qui utilise obj ici
    }
    catch(...)
    {
        // ...
    }
     
    // alors que je préfère le mettre ici en fait
    Citation Envoyé par Luc Hermitte
    Autre question : es-tu sûr que tu traites l'erreur à l'endroit où elle doit l'être ? (la question cachée dans la question se résume à "profites-tu du RAII?")
    En fait on peut comparer avec les std::fstream. En effet lors qu'ouvre un fichier je dois faire ensuite un is_open() pour être sûr que ca a marché, (ou un if( !mon_fichier ) c'est pas là la question).
    Moi au lieu je préfère lever une exception si la construction échoue et la récupérer pour la traiter.

    Enfin moi je la trouve bien moi la fonction init() dans ce cas précis.

    Et c'est bête parce'que l'on a déjà eu ce débat mais visiblement victime du délestage

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Loulou24
    Exact ! Je croiais avoir fait un poste à part entière et je ne cherchais donc que dans les titres de mes postes. Désolé

    Donc oui c'était ce poste et la solution a été pour moi de faire une fonction init() et tout marche très bien

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Yabo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
    {
        maclass obj(...)
     
        // je dois mettre tout le code qui utilise obj ici
    }
    catch(...)
    {
        // ...
    }
     
    // alors que je préfère le mettre ici en fait
    Et cette préférence est-elle fondée sur quelque chose ?

    Citation Envoyé par Yabo
    Citation Envoyé par Luc Hermitte
    Autre question : es-tu sûr que tu traites l'erreur à l'endroit où elle doit l'être ? (la question cachée dans la question se résume à "profites-tu du RAII?")
    En fait on peut comparer avec les std::fstream. En effet lors qu'ouvre un fichier je dois faire ensuite un is_open() pour être sûr que ca a marché, (ou un if( !mon_fichier ) c'est pas là la question).
    Moi au lieu je préfère lever une exception si la construction échoue et la récupérer pour la traiter.
    Tu souhaite lever une exception, ok, pourquoi pas. Par contre, si tu as besoin de try/catch pour faire du ménage, alors là, je ne suis pas d'accord (et je rejoins Luc). Il a été montré que c'est impossible à gérer comme ça, et que le RAII est bien suppérieur. Pour moi, un try/catch ne doit apparaître que dans 4 situations :
    - Quand on est capable de gérer l'erreur (affichage, redémarrage de l'appli...)
    - Une fois par thread au plus haut niveau, pour les cas qu'on a pas géré, histoire d'essayer en désespoire de cause d'afficher un message à l'utilisateur
    - Quand on sort du langage C++ (passage à du C, Fortran... qui ne supportent pas les exceptions)
    - Quand on adapte une exception d'une bibliothèque pour en faire une exception d'un autre type (et donc avec un throw à la fin du catch).

    Citation Envoyé par Yabo
    Et c'est bête parce'que l'on a déjà eu ce débat mais visiblement victime du délestage
    Mais j'étais pas là à l'époque, alors que maintenant, je peux jouer aussi...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par JolyLoic
    Citation Envoyé par Yabo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
    {
        maclass obj(...)
     
        // je dois mettre tout le code qui utilise obj ici
    }
    catch(...)
    {
        // ...
    }
     
    // alors que je préfère le mettre ici en fait
    Et cette préférence est-elle fondée sur quelque chose ?
    Ne pas imbriquer le code encore et encore. Luc m'avait déjà proposé cette solution :
    Citation Envoyé par Luc Hermitte
    Hum... Difficile de répondre de manière générale.
    Si ton constructeur échoue, de toutes façons tu vas remonter et tu ne pourras pas continuer ta fonction. Il est des cas où l'on ne veut englober que le constructeur il vrai. Mais ne peux-tu pas tout simplement étendre ton try jusqu'à la fin de la fonction ? Quitte à faire un catch spécialisé sur les erreurs de construction de A.
    Mais évidemment avec la classe A c'est envisageable mais la réalité est plus complexe.
    Je viens de relire le code que j'avais fait à l'époque. Bon donc en gros ce qu'il me fallait c'était un objet qui ne soit pas un pointeur, qui ait une très grande portée dans le programme (c'était une classe pour gérer les fichiers de log donc j'ai besoin de l'objet un peu partout (rassurez-vous j'ai pas fais de variables globales )), et dont la contruction puisse être dans un bloc try{} catch(){}.

    En relisant mon code ce que j'ai fait :

    une fonction init() privée suceptible de lever une exception
    une fonction begin() qui a la tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void CLog::Begin(const char *FileName, bool Overwrite)
    {
    	try
    	{
    		Init(FileName, Overwrite);
    	}
    	catch(CLogErr &err)
    	{
    		err.debug();
    		cerr << "Log level set to None" << endl;
    		SetLevel(None);
    	}
    }
    Et mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CLog::CLog(const char *FileName, bool Overwrite)
    {
    	Begin(FileName, Overwrite);
    }

    Donc en fait j'ai fait une fonction d'init mais pas dans le sens que j'ai évoqué précédemment. Ca date de juillet quand même ce débat depuis le temps hein ...

    Citation Envoyé par JolyLoic
    Mais j'étais pas là à l'époque, alors que maintenant, je peux jouer aussi... Coucou
    Avec plaisir

Discussions similaires

  1. [Servlet] Problème Methode init
    Par drixfkc dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/08/2006, 12h58
  2. [CR8.5] Init paramètre plage de valeurs
    Par juelo dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 08/04/2005, 16h19
  3. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  4. Réponses: 5
    Dernier message: 24/08/2004, 18h11
  5. [debutant] [servlets] methode init()
    Par be_on_edge dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 01/03/2004, 15h11

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