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 :

redéfinition du type 'class'


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut redéfinition du type 'class'
    Bonjour à vous,

    Me voila de nouveau sur le forum pour un petit soucis que je n'arrive pas à résoudre et je sais que sa provient de la définition de la surcharge opérateur<<, voici mon code:

    header2.cpp:
    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
     
    #include <iostream>
    using namespace std;
     
    class Point3D
    {
    protected:
    	double x, y, z;
    public:
    	//Constructeur par defaut
    	Point3D() : x(0.0), y(0.0), z(0.0) {}
    	//Constructeur par 3 coordonnées
    	Point3D(double x, double y, double z) : x(x), y(y), z(z) {}
    	//Methode de comparaison
    	bool operator==(const Point3D&) const;
     
    	//Methode d'acces en lecture
    	double get_x() { return x; }
    	double get_y() { return y; }
    	double get_z() { return z; }
    };
     
    ostream& operator<<(ostream&, const Point3D&);
    Source2.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include "Header2.h"
     
    bool Point3D::operator==(const Point3D& autre) const
    {
    	return (x==autre.x) && (y==autre.y) && (z==autre.z);
    }
     
    ostream& operator<<(ostream& sortie, const Point3D& p)
    {
    	sortie << '( ' << p.get_x() << ", " << p.get_y() << ", " << p.get_z() << ' )';
    	return sortie;
    }
    main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "Header2.h"
    #include "Source2.cpp"
     
    int main()
    {
    	Point3D p1(1.0, 3.5, -4.2);
    	system("pause");
    	return 0;
    }

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    Euh je vous rajoute mon message d'erreur lorsque je lance la compilation:

    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
    1>------ Début de la génération*: Projet*: Projet1, Configuration*: Debug Win32 ------
    1>  main.cpp
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5): error C2011: 'Point3D'*: redéfinition du type 'class'
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(3): error C2027: utilisation du type non défini 'Point3D'
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(4): error C2270: '=='*: modificateurs non autorisés sur les fonctions non membres
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2065: 'x'*: identificateur non déclaré
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2027: utilisation du type non défini 'Point3D'
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2228: la partie gauche de '.x' doit avoir un class/struct/union
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2065: 'y'*: identificateur non déclaré
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2228: la partie gauche de '.y' doit avoir un class/struct/union
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2065: 'z'*: identificateur non déclaré
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(5): error C2228: la partie gauche de '.z' doit avoir un class/struct/union
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2027: utilisation du type non défini 'Point3D'
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2228: la partie gauche de '.get_x' doit avoir un class/struct/union
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2228: la partie gauche de '.get_y' doit avoir un class/struct/union
    1>          c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\header2.h(5)*: voir la déclaration de 'Point3D'
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2228: la partie gauche de '.get_z' doit avoir un class/struct/union
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\main.cpp(6): error C2079: 'p1' utilise une class de 'Point3D' non défini
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\main.cpp(6): error C2078: initialiseurs trop nombreux
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\main.cpp(6): warning C4244: 'initialisation'*: conversion de 'double' en 'int', perte possible de données
    1>  Source2.cpp
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_x'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1>          La conversion perd les qualificateurs
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_y'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1>          La conversion perd les qualificateurs
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_z'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1>          La conversion perd les qualificateurs
    1>  Génération de code en cours...
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 036
    Points
    33 036
    Billets dans le blog
    4
    Par défaut
    Depuis quand on inclut un .cpp ?

    http://cpp.developpez.com/faq/cpp/?p...un-fichier-cpp

    btw, tes getter gagneraient à être const
    une classe point généralement c'est un POD, un simple struct et tout public et basta

  4. #4
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    @Bousk: c'est tout à fait possible mais très rarement utilisé (je n'ai vu ça qu'en C à vrai dire).

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 036
    Points
    33 036
    Billets dans le blog
    4
    Par défaut
    Rien ne l'empêche, ça existe oui, en C++ aussi évidemment, on s'en sert d'optim de compil avec des "masterfiles" sur des gros projets.
    Sauf qu'ici on est en présence d'un débutant, et donc que c'est hors contexte et juste signe d'une erreur.

  6. #6
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    @Bousk: Désolé, j'ai mal interprété ta réponse. Je pensais que tu ne savais pas que cela était possible ou alors que c'était absolument interdit (façon de parler) de faire ça. Mais en effet, cela n'a rien à faire dans le code d'un débutant.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    Oui j'ai oublié de préciser que j'étais débutant
    Par contre Bousk je te remercie et si j'ai bien compris je dois juste rajouter un const devant mes getters? Si c'est cà la solution je l'ai déja essayé et sa n'a pas marché.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 150
    Points : 12 257
    Points
    12 257
    Par défaut
    Pas d'include de .cpp.
    Tous les .h doivent disposer d'un header guard. http://fr.wikipedia.org/wiki/Include_guard

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    Alors voila mes rectifications dans le header, après avoir enlever l'inclusion du .cpp dans le main:

    Header2.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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
    #include <iostream>
    #ifndef POINT3D_H
    #define POINT3D_H
     
    using namespace std;
     
    class Point3D
    {
    protected:
    	double x, y, z;
    public:
    	//Constructeur par defaut
    	Point3D() : x(0.0), y(0.0), z(0.0) {}
    	//Constructeur par 3 coordonnées
    	Point3D(double x, double y, double z) : x(x), y(y), z(z) {}
    	//Methode de comparaison
    	bool operator==(const Point3D&) const;
     
    	//Methode d'acces en lecture
    	const double get_x() { return x; }
    	const double get_y() { return y; }
    	const double get_z() { return z; }
    };
     
    ostream& operator<<(ostream&, const Point3D&);
     
    #endif
    j'ai encore un message d'erreur et j'avoue être un peu dans les choux :

    1>------ Début de la génération*: Projet*: Projet1, Configuration*: Debug Win32 ------
    1> main.cpp
    1> Source2.cpp
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_x'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1> La conversion perd les qualificateurs
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_y'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1> La conversion perd les qualificateurs
    1>c:\users\mr\documents\visual studio 2012\projects\projet1\projet1\source2.cpp(10): error C2662: 'Point3D::get_z'*: impossible de convertir un pointeur 'this' de 'const Point3D' en 'Point3D &'
    1> La conversion perd les qualificateurs
    1> Génération de code en cours...
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 150
    Points : 12 257
    Points
    12 257
    Par défaut
    Le header guard, c'est avant les includes.
    Pas d'using namespace dans les headers.

    Et maintenant, vous devez :
    btw, tes getter gagneraient à être const
    Vos getters DOIVENT être const.
    Par contre Bousk je te remercie et si j'ai bien compris je dois juste rajouter un const devant mes getters
    Non, c'est après la liste des paramètres.
    Comme dans votre operateur "==" de votre classe.

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    const s'applique au premier type à gauche, ou, à défaut, au premier à droite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Clas {
    public:
        const double get_x();
    };
    Dans ce code, c'est double qui est const, donc la valeur de retour de la fonction. Ce qui n'est pas intéressant, vue que c'est une copie (d'un type primitif).

    Pour rendre la fonction constante, c'est la () qui doit être consté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Clas {
    public:
        double get_x() const;
    };
    Seules les fonctions membres constantes peuvent être appelée sur un objet constant.
    Elles ne pourront pas modifier l'objet (sauf les éventuelles variables mutable)

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/04/2009, 10h39
  2. redéfinition du type 'class'
    Par Seb33300 dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 27/04/2007, 12h14
  3. Parametre de type class
    Par mzibri dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 05/06/2006, 21h34
  4. Réponses: 2
    Dernier message: 09/05/2006, 12h30
  5. [Débutant][Conception] Mettre à jour un objet de type classe
    Par Sylvester dans le forum Général Java
    Réponses: 19
    Dernier message: 09/02/2006, 17h59

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