struct avec const membre

Je vais avoir quelques problèmes avec un template struct.

template<typename T>
struct A{
    const int v1;
    T* v2;
};

Mon but est de faire v1 toujours pas modifiable, tout en v2 devrait être modifiable si j'utilise T et non modifiable si j'utilise const T type.

Si je créer constructeur pour initialiser A, la structure devient:

template<typename T>
struct A{
    const int v1;
    T* v2;
    A() : v1(-1) { v2=NULL; }
    A(int value) : v1(value) { v2=NULL; }
};

Mais alors g++ dit que j'ai besoin d'un opérateur d'affectation:

erreur: non-static const membre ‘const int A::v1’, ne peut pas utiliser l'affectation par défaut de l'opérateur

Mais mon opérateur d'affectation doit également permettre la modification de v1. La seule chose que je voudrais éviter, c'est une modification de l'extérieur, quelque chose comme:

A a;
a.v1=10;

Est-il possible de mettre en œuvre des ce (sans créer de getter/setter ou à l'aide d'un pointeur vers un nouveau(int) avec la valeur souhaitée)?

Ce que si je déclare v1 comme const int * ? Il peut faire référence qu'à une certaine valeur, mais il ne peut pas le modifier.

  • "sans la conversion de structure de classe (...)" Ce que vous avez est déjà une classe.
  • Vous devez comprendre qu'en C++, une structure EST une classe, il suffit d'un type très précis de la classe. Une structure est une classe où tout est public.
  • Si l'opérateur d'affectation est en mesure de modifier const membres alors vous avez encore le problème de la modifier à partir de l'extérieur parce que je peux, il suffit de faire une cession de l'ensemble de l'objet au lieu de modifier obj.v1 par lui-même
  • Exactement pourquoi ne voulez-vous pas ajouter des accesseurs/mutateurs, par le chemin?
  • const mutable serait très utile 🙂
  • parce que l'Un doit être un struct, donc je ne peut pas utiliser les données privées.
  • Ce que si je supprime les constructeurs et les déclarer v1 comme const int*, alors je pourrais changer l'adresse v1 points, mais pas la valeur de la valeur indiquée.
  • struct est une classe où tout est public". Non, une structure est une classe où les membres et les bases sont publiques par défaut. Les structures peuvent encore avoir privé les membres. Essentiellement, il n'est pas question que vous utilisez de struct et class, aussi longtemps que vous êtes cohérent tout cela affecte est l'endroit où vous devez taper des spécificateurs d'accès. Elle peut également affecter la façon dont le nom est mutilé.
  • "Mon but est de faire de la v1 toujours pas modifiable" ... "ma mission à l'opérateur doit également permettre la modification de v1" -- il est votre problème, en contradiction directe avec les exigences. Choisissez l'un d'entre eux à abandonner.
  • Je suis en train de penser à déclarer v1 comme const int* , de sorte que je peux changer v1 (adresse et la valeur v1 points), mais je ne peux pas le modifier.
  • mais alors, qui que ce soit que vous essayez d'éviter de modifier la valeur de v1 quand il était un const int, peut modifier la valeur du pointeur maintenant que c'est un const int *. De Plus, vous avez la question de savoir comment la ints sont allouées et libéré. Il n'y a pas de bonne façon de permettre à l'opérateur d'assignation de copie pour modifier la valeur, tout en empêchant d'autres fonctions membre de le modifier. Ni est-il une bonne façon d'exposer un non-const membre du public d'une manière qui les empêche de l'écrire. C++ n'ont pas cette fine encapsulation intégré, vous avez passer votre propre.
  • laissez-nous continuer cette discussion dans le chat

InformationsquelleAutor Vektor88 | 2012-02-09