C++ définition d'une constante variable membre à l'intérieur de constructeur de classe

Habituellement, lorsque vous avez une constante variable membre privée dans votre classe, qui n'a qu'un getter, mais pas de setter, il ressemblerait à quelque chose comme ceci:

//Example.h
class Example {
    public:
        Example(const int value);
        const int getValue() const;
    private:
        const int m_value;
};


//Example.cpp
#include "Example.h"

Example::Example(const int value)
: m_value(value)
{
}

const int Example::getValue() const
{
    return m_value;
}

Maintenant ce que j'essaie de faire, c'est avoir une constante de type int variable membre comme ça, mais au lieu de le définir dans l'initialisation de l'article comme suit: : m_value(value) j'ai besoin de prendre un autre objet - je vais utiliser un vecteur dans cet exemple - comme le constructeur du paramètre, et l'ensemble de m_value basé sur le paramètre de l'objet. Dans ce cas, je vais essayer de faire du vecteur de taille de + 1, si la taille est au-dessus de 0. C'est donc ce que j'ai fait:

Example::Example(std::vector<Example*> myVec)
{
    if (myVec.size()) {
        m_value = myVec.size() + 1;
    }
    else {
        m_value = -1;
    }
}

Mais j'obtiens une erreur uninitialized member 'Example::m_value' with 'const' type 'const int' et si je init m_value à l'intérieur de l'initialisation de l'article, j'obtiens l'erreur assignment of read-only data-member 'Example::m_value' qui prend tout son sens pour moi, je suis censé obtenir ces erreurs, mais comment pourrais-je aller autour d'eux?

Edit: Seule façon que je pouvais modifier m_value est à l'intérieur de l'objet lui-même (depuis m_value est privé). Le fait d'avoir seulement getter limiterait moi de réglage de m_value à autre chose que ce qu'il est défini dans le constructeur. Puis-je bénéficier de tout, d'avoir de la constante de type int comme une variable de membre?

: m_value(!myVec.empty() ? myVec.size() + 1 : -1) ?
pourquoi a-t-elle à être const?
Par rapport à votre mise à jour - non, aucun des avantages que je peux voir...
C'est constant, de sorte qu'il ne peut jamais être changé de toute façon. Je suis en l'utilisant comme identifiant unique pour les objets dans mon jeu, et je veux que ces identificateurs de rester le même pendant tout le match. Je pensais que ça serait une bonne idée pour la rendre constante, toujours pas sûr de savoir les avantages.
Vous obtenez une certaine valeur. Le compilateur peut faire l'hypothèse que, quoi qu'il arrive, les appels répétés à la lecture pour le même objet donnera la même valeur. Mais en l'utilisant comme un identifiant unique, et bien... c'est ce que les pointeurs sont pour.

OriginalL'auteur | 2012-11-27