9
votes

Variables statiques en méthode statique en classe de base et héritage

J'ai ces classes C ++: xxx

la variable statique x sera partagée entre A et b , ou chacun d'entre eux aura-t-il sa propre variable indépendante x (qui est ce que je veux)?


3 commentaires

N'est-ce pas quelque chose que vous pouvez vérifier rapidement avec un compilateur et un code de test?


@TTMRICHTER: Pas s'il y a des soupçons, il pourrait s'agir de la mise en œuvre. Et au moment où vous avez vérifié que ce n'est pas le cas, vous avez trouvé la réponse.


@TTMRICHTER J'ai soupçonné que la variable sera partagée, mais je voulais aussi voir si quelqu'un a une autre façon de résoudre mon problème :)


6 Réponses :


14
votes

Il n'y aura qu'une seule instance de x code> dans l'ensemble du programme. Un bon travail est d'utiliser le CRTP :

template <class Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A> { };
class B : public Base<B> { };


4 commentaires

Nice, tu as posté pendant que j'étais sur le point de soumettre :).


Mais ce que vous n'obtenez pas, c'est le polymorphisme, si cela est nécessaire.


Merci, j'ai oublié que j'ai résolu un problème très similaire il y a de nombreuses années, aussi avec CRTP :)


@neil polymorphisme n'est pas nécessaire, je voulais juste éviter d'avoir du code dupliqué



3
votes

Il n'y en aura qu'un, partagé par les trois classes. Si vous souhaitez des instances séparées, vous devrez créer des fonctions distinctes dans les classes dérivées.


0 commentaires

2
votes

le premier. Les variables statiques locales sont liées à la méthode qui les contenant et existe dans une incarnation pour toutes les sous-classes (en fait, pour toute l'application, même si le reste du programme ne voit pas la méthode).


0 commentaires

1
votes

La variable sera partagée - elle est par fonction - dans ce cas, la fonction qu'il appartient est base :: méthode () . Toutefois, si la base de classe était une classe de modèle, vous obtiendriez une instance de la variable pour chaque instanciation (chaque ensemble unique de paramètres de modèles réels) de la base de classe - chaque instanciation est une nouvelle fonction.


0 commentaires

1
votes

Si vous faites X comme statique, il sera partagé parmi toutes les classes d'enfants. Aucun problème avec la fonction d'être statique.


0 commentaires

3
votes

Je suis sûr que ce sera partagé entre A et B.

Si vous souhaitez des variables indépendantes, vous pouvez utiliser le "modèle de modèle récurrent curieusement récurrent" comme: xxx

Bien sûr, si vous voulez un polymorphisme, vous devriez définir une classe uniforme «baser» que la base dérive de, comme base est différente de la base Comme: xxx

A et B peut aussi être polymorphe.


0 commentaires