4 votes

définition explicite d'un membre statique

Considérons ce code :

#include<iostream>
using namespace std;
class Wilma
{
    public:
        static int i;
        Wilma()
        {
            cout<<"\nWilma ctor\n";
            cout<<"\ni::"<<i<<"\n";
        }
};
class Fred
{
    public:
        Fred()
        {
            cout<<"\nFred ctor\n";

        }
        static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
    int a=0;
    Wilma::i=a;//---------- LINE C
    Wilma w;
    Fred::wilma_=w;//---------- LINE B

}

Ici, la ligne A définit explicitement l'int statique a de la classe Wilma (commenté pour provoquer une erreur de linker). et sans laquelle le linker donne une erreur de référence non définie (parce que Wilma::i est en fait utilisé, si je ne l'utilise pas, il n'y a pas d'erreur de linker).

Il devrait en être de même pour static Wilma wilma_ de la classe Fred, c'est-à-dire qu'il devrait également être explicitement défini, car il est également utilisé dans le code à la ligne B. Mais ce n'est pas le cas, aucune erreur de linker pour Fred::wilma_ si elle n'a pas été explicitement définie. pourquoi ? Testé sur gcc 4.5.2

EDIT : J'ai un autre doute à ce sujet...

LIGNE C y LIGNE B Les deux tentent d'utiliser des objets statiques d'une classe, int Wilma::i y Wilma Fred::wilma_ respectivement. Mais seule une définition de int Wilma::i est obligatoire ?

Pourquoi l Wilma Fred::wilma_; obligatoire ?

Je comprends la réponse que le ligne B est un no-op, mais on peut dire la même chose de ligne C aussi ??

3voto

littleadv Points 15607

Wilma n'a pas de champs non statiques. Fred::wilma_=w; ne fait rien.

éditer

S'il n'y a pas de membres non statiques, il n'y a pas de copie. En fait, l'assignation est un no-op et peut être optimisée par le compilateur, et l'éditeur de liens ne l'a jamais vue. L'ajout d'un membre non statique fait de la copie une opération réelle qui fait référence à la variable statique, de sorte que le compilateur ne peut pas l'optimiser et que l'éditeur de liens la voit.

1voto

Vous avez déclaré static int i; en Wilma mais ne l'a jamais défini. Ainsi, en rajoutant Ligne A Il en résultera que Wilma::i sera défini ce dont se plaint le compilateur. Vous devez donc définir quelque part en dehors de la classe et non dans la classe principale.

Enfin, les classes Fred et Wilma sont essentiellement vides (à l'exception d'un ctor et d'un membre de classe statique). Il n'y a rien à copier entre elles.

Edit : D'après les commentaires de @littleadv, vous devez avoir une classe identique si vous voulez effectuer une copie. Si vous mettez un int j dans la classe Wilma mais rien dans la classe Fred, alors cela ne fonctionnera pas car où doit-on mettre j dans la classe Fred ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X