Static const dans une classe

Résolu
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 4 janv. 2008 à 15:16
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 4 janv. 2008 à 19:02
Bonjour à tous,

J'ai la classe suivante qui permet de manipuler des coordonnees :
<ol><li>#ifndef COORDINATES_H</li><li>#define COORDINATES_H</li><li>
</li><li>#include <ostream></li><li>    using std::ostream;</li><li>
</li><li>/**</li><li> * Classe Coordinates.</li><li> * Classe permettant de gerer des coordonnees.</li><li> */</li><li>class Coordinates</li><li>{</li><li>private:</li><li>    /** @var abscisse */</li><li>    int x;</li><li>    /** @var ordonnee */</li><li>    int y;</li><li>
</li><li>public:    </li><li>    /** @var coordonnees au dessus */</li><li>    static const Coordinates up(0,1);</li><li>    /** @var coordonnees en dessous */</li><li>    static const Coordinates down(0,-1);</li><li>    /** @var coordonnees a droite */</li><li>    static const Coordinates right(1,0);</li><li>    /** @var coordonnees a gauche */</li><li>    static const Coordinates left(-1,0);</li><li>    </li><li>    /** @var coordonnees au dessus a droite */</li><li>    static const Coordinates up_right(up+right);</li><li>    /** @var coordonnees au dessus a gauche */</li><li>    static const Coordinates up_left(up+left);</li><li>    /** @var coordonnees en dessous a droite */</li><li>    static const Coordinates down_right(down+right);</li><li>    /** @var coordonnees en dessous a gauche */</li><li>    static const Coordinates down_left(down+left);</li><li>
</li><li>    /** @var tableau contenant les 8 directions */</li><li>    static const Coordinates directions[8]={up, up_right, right, down_right, down, down_left, left, up_left};</li><li>
</li><li>    /**</li><li>     * Constructeur.</li><li>     * @param x_ abscisse</li><li>     * @param y_ ordonnee</li><li>     */</li><li>    Coordinates(int x_, int y_);</li><li>    /**</li><li>     * Constructeur de copie.</li><li>     * @param rCoordinates reference sur l'objet Coordinates a copier</li><li>     */</li><li>    Coordinates(const Coordinates & rCoordinates);</li><li>    /**</li><li>     * Destructeur.</li><li>     */</li><li>    ~Coordinates();</li><li>    /**</li><li>     * Accesseur pour x.</li><li>     * @return abscisse</li><li>     */</li><li>    int getX();</li><li>    /**</li><li>     * Accesseur pour y.</li><li>     * @return ordonnee</li><li>     */</li><li>    int getY();</li><li>    /**</li><li>     * Mutateur pour x.</li><li>     * @param x_ nouvelle abscisse</li><li>     */</li><li>    void setX(int x_);</li><li>    /**</li><li>     * Mutateur pour y.</li><li>     * @param y_ nouvelle ordonnee</li><li>     */</li><li>    void setY(int y_);</li><li>    /**</li><li>     * Mutateur pour x et y.</li><li>     * @param x_ nouvelle abscisse</li><li>     * @param y_ nouvelle ordonnee</li><li>     */</li><li>    void setXY(int x_, int y_);</li><li>    /**</li><li>     * Surcharge de l'operateur d'affectation.</li><li>     * @param rCoordinates reference sur les coordonnees a copier.</li><li>     * @return reference sur la copie.</li><li>     */</li><li>    Coordinates& operator=(const Coordinates& rCoordinates);</li><li>    /**</li><li>     * Surcharge de l'operateur addition.</li><li>     * @param rCoordinates reference sur les coordonnees a additionner avec les coordonnees courantes.</li><li>     * @return addition des coordonnees.</li><li>     */</li><li>    Coordinates operator+(const Coordinates& rCoordinates) const;</li><li>    /**</li><li>     * Surcharge de l'operateur addition puis affectation.</li><li>     * @param rCoordinates reference sur les coordonnees a ajouter aux coordonnees courantes.</li><li>     * @return somme des coordonnees.</li><li>     */</li><li>    Coordinates& operator+=(const Coordinates& rCoordinates);</li><li>    /**</li><li>     * Surcharge de l'operateur addition puis affectation.</li><li>     * @param rCoordinates reference sur les coordonnees a comparer aux coordonnees courantes.</li><li>     * @return true si les coordonnees sont identiques, sinon false</li><li>     */</li><li>    bool operator==(const Coordinates& rCoordinates) const;</li><li>    /**</li><li>     * Surcharge de l'operateur addition puis affectation.</li><li>     * @param rCoordinates reference sur les coordonnees a comparer aux coordonnees courantes.</li><li>     * @return true si les coordonnees sont differentes, sinon false</li><li>     */</li><li>    bool operator!=(const Coordinates& rCoordinates) const;</li><li>    /**</li><li>     * Surcharge de l'operateur <<.</li><li>     * @return flux sortant contenant les coordonnees.</li><li>     */</li><li>    friend ostream& operator<<(ostream& out, const Coordinates& rCoordinates);</li><li>};</li><li>
</li><li>ostream& operator<<(ostream& out,const Coordinates& rCoordinates);</li><li>
</li><li>#endif</li></ol>Mais lorsque je compile :

Coordinates.h:21: erreur: expected identifier before numeric constant
Coordinates.h:21: erreur: expected «," or «..." before numeric constant
Coordinates.h:23: erreur: expected identifier before numeric constant
Coordinates.h:23: erreur: expected «," or «..." before numeric constant
Coordinates.h:25: erreur: expected identifier before numeric constant
Coordinates.h:25: erreur: expected «," or «..." before numeric constant
Coordinates.h:27: erreur: expected identifier before «-" token
Coordinates.h:27: erreur: expected «," or «..." before «-" token
Coordinates.h:30: erreur: «up" is not a type
Coordinates.h:30: erreur: expected «," or «..." before «+" token
Coordinates.h:32: erreur: «up" is not a type
Coordinates.h:32: erreur: expected «," or «..." before «+" token
Coordinates.h:34: erreur: «down" is not a type
Coordinates.h:34: erreur: expected «," or «..." before «+" token
Coordinates.h:36: erreur: «down" is not a type
Coordinates.h:36: erreur: expected «," or «..." before «+" token
Coordinates.h:39: erreur: a brace-enclosed initializer is not allowed here before «{" token
Coordinates.h:39: erreur: invalid in-class initialization of static data member of non-integral type «const Coordinates [8]"

Je voudrais utiliser up/down/right... de la manière suivante par exemple :
position += Coordonnees::up;

En mettant mon bloc de "static const" (lignes 20->39) après ma classe (ligne 120), ça compile mais up/down/right... ne font plus parti du namespace Coordonnees. Je peux donc les utiliser comme ça :
position += up;
mais je trouve que c'est beaucoup moins clair.

Est-ce quelqu'un aurait une solution ?

Merci d'avance.

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 janv. 2008 à 17:12
Tu peux pas initialiser les membres static en meme temps que leur déclaration:

Fichier .h:

class Coordinates
{
...
static const Coordinates up; // déclaration
...
};

Fichier .cpp:
const Coordinates Coordinates::up(0, 1); // implémentation

Ca règlera ton pb.
3
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
4 janv. 2008 à 17:17
Salut,

la raison pour laquelle le programme ne compile pas c'est que tu essaies de definir un bloc de memoire ayant les proprietes du'une classe avant meme que cettte classe ne soit creee. Par contre en utilisant un pointeur, ca passera.Exemple:

fichier .hpp
class Test
{
    public:
       Test();
       virtual~ Test();

    static const Test *m_staticTest;
    static long m_ref;
}
fichier .cpp
#include "Test.hpp"

const Test* Test::m_staticTest = new Test;
long Test::m_ref = 0;

Test::Test()
{
    ++m_ref;
}
Test::~Test()
{
    if(!--m_ref) delete m_staticTest;
}

J'espere avoir aide, Salut et Bonne annee 2008
je suis heureux de faire partie d'une grande famille ...!
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 janv. 2008 à 17:29
[auteur/NICKYDAQUICK/43984.aspx nickydaquick]

Non, le pointeur n'est pas nécessaire. Le meme static déclarer de facon statique ne pose aucun problème ici. Le seul pb est qu'il initialise le membre static lors de sa déclaration.
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
4 janv. 2008 à 19:02
C'est exactement ce que je voulais, merci.
Je savais pas (ou j'avais oublié) que l'on ne pouvait pas initialiser un membre static lors de la déclaration.
0
Rejoignez-nous