Nested class access

Résolu
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 4 sept. 2011 à 00:01
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 4 sept. 2011 à 17:36
Bonsoir,

Je n'arrive pas à trouver comment je peux faire dans le cas suivant :

Imaginons :

Class A
{
Private :
Int *mavar;

Public :
Class iterateur_de_a
{
//Je voudrais pouvoir accéder a la variable mavar
}
}

Est-ce possible ?
j'ai essayé protected a la place de Private, mais ça ne semble pas changer grand chose.

  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!

8 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 sept. 2011 à 17:36
mais ça risque pas d'être lourd en comparaison

Non, ça ne l'est pas. Un std::vector, ça reste un tableau (avec *) dont l'allocation est prise en charge en interne intelligemment.
De plus, dans un std::vector, tu peux reserver un espace fixe, si nécessaire.
Enfin, si vraiment la taille est complètement fixe, alors std::array pourrait être plus adapté.

nested classes (ya pas un équivalent francais ?)

Classes imbriquées ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 sept. 2011 à 01:27
Pourquoi as-tu besoin de ce mécanisme ? C'est étrange. Si tu veux créer un iterator et si mavar représente la position, cet attribut devrait plutôt être dans la classe iterateur_de_a, non ?
Je serais curieux de savoir à quoi tu vas appliquer cela.

Pour répondre techniquement à ta question:
Même si c'est une inner classe, une classe ne fait pas partie d'une autre. C'est juste la visibilité qui change, et rien d'autre. Donc il te faut un moyen d'interaction.
Par exemple:
#include 

class Foo
{
public:
  Foo()
    : _mavar(0), _inner(*this)
  {
  }

  class InnerFoo
  {
  public:
    InnerFoo(Foo& foo)
      : _foo(foo)
    {
    }

    void func()
    {
      std::cout << _foo._mavar << std::endl;
    }
  private:
    Foo&	_foo;
  };

  void func()
  {
    _inner.func();
  }

private:
  int*		_mavar;
  InnerFoo	_inner;
};

int main()
{
  Foo foo;

  return 0;
}


Tu noteras que tu pourrais très bien avoir 2 objets de type InnerClass.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
4 sept. 2011 à 10:02
Merci pour la réponse.

Je vais préciser d'avantage ce que je suis en train de faire.

Je code une class skip list.
Class skiplist
{
Private :
struct node
{
node **nexts;
string key;
void *value;//en fait c'est en te plate, mais je simplifie ici.
}
node *first;
public :
Class iterator
{
node * current;
}
}

Mon but est donc de pouvoir itérer la skip liste, mais je ne veut pas qu'il y ai un moyen pour que quelqu'un d'autre que skiplist ou iterator ai connaissance de node.


  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 sept. 2011 à 10:54
Si tu cherches à réaliser une liste chaînée, inutile de réinventer la roue.
Tu as: std::list pour une liste doublement chaînée, et std::forward_list pour une liste simplement chaînée.

En C++, il y a plusieurs réflexes à avoir. Lors que tu vois certaines choses dans un code, tu peux être sur que c'est louche. Ces signes sont:
- Utilisation d'un void* (Très très louche)
- Utilisation d'un ** (Très très louche)
- Utilisation d'un * (louche bien que possible)
- string au lieu de std::string (moyen, Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace)

De plus, par convention (totalement libre à toi de la suivre, ce n'est qu'une convention):
- Une classe commence par une majuscule (Pascal Case)
- Un attribut de classe est différencier des autres (par exemple en le précédent d'un '_').
- Méthode et variable sont en général en Camel Case.
- L'étoile ou la référence touche le type, et non la variable (contrairement au C).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
4 sept. 2011 à 12:20
En fait, il s'agit bien ici d'une skip list et non d'une liste chainée, c'est pour ça que j'ai besoins de mon node**, puisque la skip list contient finalement un nombre pour le moment inconnu de liens vers les suivantes.

Le void* value, ce n'est pas ce que j'ai mis dans le code, mais la je suis sur ma tablette et j'avoues que c'est relativement chiant de rédiger (correcteur auto et autres inconvénients), donc je n'ai pas mis les templates.

Mais, il est donc impossible que la classe interne ait accès a un membre de la classe de base, sans pour autant donner cet accès en openbar (public) ?

  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
4 sept. 2011 à 12:25
J'oublie, autant préciser, j'ai regardé Std::map (une red black grée en fait), j'ai vérifié et certains recommandent plutôt la skip list.

  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 sept. 2011 à 14:37
node** => Juste pas possible en C++ (conceptuellement, pas techniquement). Il y a forcément un souci de conception quand tu vois ça. std::vector ou std::list à la place.
Prend aussi la bonne habitude de remplacer les pointeurs pas des références dès que c'est possible, ou par des smart pointers.

impossible que la classe interne ait accès a un membre de la classe de base,

Tu confonds classe et objet. Une classe n'est pas du code. C'est une moule qui décrit un objet. Tout comme une structure en C. Est-ce qu'en C tu te demanderais si une structure interne peut accéder aux champs de sa structure mère ? Non, car il n'y a pas de valeurs dans une structure, il n'y en a uniquement si tu crées une structure de ce type. Donc tu as bien accès à une variable, mais à condition d'en avoir une instance (un objet si tu préfères). Quand tu crées une classe interne, c'est comme si tu déclarait une classe normale, mais dont l'amitié serait automatique (mot clé "friend").

sans pour autant donner cet accès en openbar (public)

En quoi est-ce gênant ? Une classe interne à tout intérêt à avoir accès à sa classe mère, non ? Le fait que la classe interne voit sa classe mère publiquement, ne veux pas dire pour autant que toutes les classes verront celles-ci publiquement à leur tour.

J'oublie, autant préciser, j'ai regardé Std::map (une red black grée en fait), j'ai vérifié et certains recommandent plutôt la skip list.

Si tu te questionnes sur une std::map ou une skip list, alors c'est que tu as besoin d'accéder rapidement à un élément. Je ne suis dans ce cas pas vraiment convaincu par une skip list. Si tu recherches une collection à accès rapide, alors je te conseille plutôt une std::unordered_map (ou std::unordered_multimap selon les besoins). C'est une table de hash donc à accès O(1).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
4 sept. 2011 à 16:53
Utiliser un vector a la place du **... en effet c'est une solution, mais ça risque pas d'être lourd en comparaison ?
Sachant que le ** veut ici seulement dire qu'on ne connait la taille que a l'allocation, en dehors de ça elle est fixe !

Sinon, merci, c'est la notion de friend qui me manquait. Quand je disait public, c'était bien vis a vis de tout le monde !

Concernant la hash table, en effet pourquoi pas, mais la question était aussi présente pour l'apprentissage du fonctionnement des nested classes (ya pas un équivalent francais ?).

Merci pour tes réponses

  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!
0
Rejoignez-nous