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 :

cpp et cppunit


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut cpp et cppunit
    onjour tout le monde.

    J'espère que quelqu'un pourra m'aider.

    ------------------------------------Context :
    j'ai commencé à travailler sur les tests unitaires avec "cppunit"
    J'ai donc créé les fichiers "cppunit.cpp" et "cppunit.h" en me basant sur le
    cookbook du site "http://cppunit.sourceforge.net".

    ------------------------------------ERREURS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CPPUNIT.CPP
    cppunit.h(11) : warning C4508: 'Complex' : function should return a value; 'void' return type assumed
    cppunit.h(17) : error C2143: syntax error : missing ',' before '&'
    cppunit.h(17) : error C2059: syntax error : '&'
    cppunit.cpp(7) : error C2512: 'ComplexNumberTest' : no appropriate default constructor available
    Error executing cl.exe.
     
    CPPUNIT.OBJ - 3 error(s), 1 warning(s)
    ------------------------------------cppunit.h
    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
    // fichier de tests unitaires
    #include <cppunit/ui/text/TestRunner.h>
    #include <cppunit/TextTestRunner.h>
    #include <cppunit/TestResult.h>
    #include <cppunit/CompilerOutputter.h>
    #include <cppunit/XmlOutputter.h>
    #include <cppunit/extensions/TestFactoryRegistry.h>
    #include <cppunit/extensions/HelperMacros.h>
    
    class Complex() {};
    
    class ComplexNumberTest : public CppUnit::TestCase { 
    public: 
      ComplexNumberTest( std::string name ) : CppUnit::TestCase( name ) {}
      bool operator==(const Complex &a, const Complex &b) { return true; }
      void runTest() {
        CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) );
        CPPUNIT_ASSERT( !(Complex (1, 1) == Complex (2, 2)) );
      }
    };
    ------------------------------------cppunit.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // fichier de tests unitaires
     
    #include "cppunit.h"
     
    int main(void){
    	ComplexNumberTest mon_complex ;
    	return 0 ;
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Ton problème est un problème de C++ et non un pb avec CppUnit. Les erreurs du compilateur sont assez explicites.
    Que viennent faire ces parenthèses suivant le nom de la classe ? Le compilateur comprend que c'est une déclaration de fonction érronée.

    Comme la déclaration de la classe Complex n'est pas correcte, ce type n'existe pas dans la suite de la compilation d'où les deux erreurs ligne 17 (operator==).

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComplexNumberTest mon_complex;
    fait appel à un constructeur de ComplexNumberTest qui ne prend aucun paramètre. Ce constructeur n'existe pas dans ce que tu as déclaré. Le seul constructeur disponible requiert 2 paramètres.

    HTH

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Je crois que tout découle du premier warning...

    Tu déclare une classe (class Complex) mais... tu utilise une signature de "fonction" (avec les parentheses qui suivent la déclaration de ta classe)...

    Le compilo, quand il rencontre un nom suivi de parenthese, il "pense" qu'il s'agit d'une fonction, et commence donc par t'indiquer qu'il faut un type de retour pour les fonctions...

    Comme tu n'a pas fournis de type de retour '(et pour cause: tu veux que ce soit une classe ) il t'indique que le type de retour "void" sera utilisé par défaut (autrement dit qu'il s'agit d'une fonction qui ne renvoie rien... une procédure, si tu préfères, meme s'il n'y a pas à proprement parler de procédures en C++)

    Mais du coup, cela signifie, surtout que, pour lui, Complex n'est pas une classe... mais une procédure

    Alors, ben, il parrait logique que la déclaration de ton operator== chagrine quelques peu le compilateur:

    Dans la parenthese, il s'attend à trouver quelque chose du genre de
    <qualificateur de constance/volatilité> type <représentation mémoire> nom_argument et il trouve, à la place... des noms de fonctions suivi de (au fait, ca pourrait etre quoi ), ce qui justifie les deux premières erreurs.

    Enfin, le constructeur "par défaut" n'est rajouté par le compilateur que s'il n'y a aucun constructeur prévu par toi...

    Je m'explique:

    Considérons les trois classes suivantes.
    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
     
    class Maclass
    {
        public:
            // je ne prévois aucun constructeur
            ~Maclass(){}
        (...)
    };
    class Monautreclasse
    {
        public:
            //je prévois un constructeur "personnalisé"
            monautreclasse(int var):_var(var){}
           ~monautreclasse(){}
           ...
    };
    class Matroisiemeclasse
    {
        public:
            //je prévois un constructeur "personnalisé"
            Matroisiemeclasse(int var):_var(var){}
            //je prévois un constructeur "par défaut"
            Matroisiemeclasse():_var(0){}
            ~Matroisiemeclasse(){}
            ...
    }
    Pour la première, comme tu n'a pas prévu de constructeur, le compilateur en rajoute un "générique", et tu peux donc écrire un code ressemblant à
    Pour la deuxième, tu a déclaré un constructeur personnalisé, et le compilateur n'a donc pas rajouté son constructeur "générique": le seul qu'il connaisse, c'est donc celui qui prend un entier comme parametre.

    On arrive donc à la situation que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Monautreclasse monobj1; // erreur: on n'a pas de parametre pour le
                             // constructeur
    Monautreclasse monobjet(3); // seule possiblité d'appeler le constructeur
    Et, enfin, pour la troisième classe, comme on a prévu un constructeur qui ne prend aucun parametre, on en arrive à la situation où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Matroisiemeclasse monobj1;// OK monobj1._var vaut 0 par défaut
    Matroisiemeclasse monobj2(5);// OK monobj1._var vaut 5 grace au parametre
                                 // fourni
    Dans le code que tu présente, tu te trouves dans le deuxième cas: il faut une chaine - passée en parametre - de manière à initialiser correctement ta classeComplexNumberTest.

    Tu disposes donc de deux possiblités "parallelles", qui te permettront d'arriver au bon résultat:

    Soit, tu prévois un constructeur par défaut comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComplexNumberTest( ) : CppUnit::TestCase( "unnammed_complex" ) {}
    soit, tu prévois une valeur par défaut pour la chaine sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComplexNumberTest( std::string name="unnamed_complex") : CppUnit::TestCase( name ) {}
    Dans les deux cas, il sera possible d'intialiser ton ComplexNumberTest sans devoir lui fournir de parametre

    Nota: Enfin, il faut etre attentif au fait qu'il est très largement conseillé d'utiliser une référence constante sur une chaine passée en parametre...
    Le constructeur serait bien mieux sous la forme de
    ComplexNumberTest( const std::string &name ) : CppUnit::TestCase( name ) {}
    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

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut Je prend note
    Bonjour.

    Pous la classe avec les parenthèse, j'ais vu, oui.
    Pour le reste, je vais voir ça.
    En tout cas, merci pour votre aide.

    A demain (pour dire que c'est résolu je pense).

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut L'opérateur "=="
    ---------------------------------------contexte
    Voir premier message.
    J'ai toujours le problème sur l'opérateur qui persiste.
    "trop de paramètres", je veux bien. Mais j'ai deux paramètres partout.

    ---------------------------------------compilation
    CPPUNIT.CPP
    cppunit.h(22) : error C2804: binary 'operator ==' has too many parameters
    Error executing cl.exe.

    CPPUNIT.OBJ - 1 error(s), 0 warning(s)

    Voici tous les endroits où j'utilise l'opérateur :

    ---------------------------------------cppunit.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool operator ==( const Complex &a, const Complex &b )
    { 
      return (a.real == b.real)  &&  (a.imaginary == b.imaginary); 
    }
    ---------------------------------------cppunit.h
    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
    class Complex {
      friend bool operator ==(const Complex& a, const Complex& b);
      double real, imaginary;
    public:
      Complex( double r, double i = 0 ) : real(r) , imaginary(i) {}
    };
    
    
    class ComplexNumberTest : public CppUnit::TestCase { 
    public: 
      ComplexNumberTest( const std::string &name ) : CppUnit::TestCase( name ) {};
      bool operator==(const Complex &a, const Complex &b);
      void runTest() {
        CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) );
        CPPUNIT_ASSERT( !(Complex (1, 1) == Complex (2, 2)) );
      }
    };

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Fais le libre et pas membre d'une classe qui n'a rien à voir.
    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...

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut problème résolu - merci
    problème résolu - merci.

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

Discussions similaires

  1. [dev-cpp] probleme de link
    Par alex1er dans le forum Dev-C++
    Réponses: 5
    Dernier message: 20/01/2005, 17h41
  2. Mysql++ et dev-cpp..
    Par MrPomme dans le forum Windows
    Réponses: 4
    Dernier message: 03/08/2004, 14h50
  3. probleme avec d3dsettings.cpp
    Par bakonu dans le forum DirectX
    Réponses: 0
    Dernier message: 03/03/2004, 21h33
  4. compilation directx dev-cpp
    Par gaut dans le forum DirectX
    Réponses: 3
    Dernier message: 11/02/2004, 04h16
  5. creation DLL dev-cpp
    Par gaut dans le forum Dev-C++
    Réponses: 4
    Dernier message: 29/01/2004, 18h15

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