Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] C++ error al acceder a miembro privado desde clase anidada y friend

Estas en el tema de C++ error al acceder a miembro privado desde clase anidada y friend en el foro de C/C++ en Foros del Web. El problema es el siguiente, tengo una clase llamada diccionario, en la que uso templates y tengo anidada la clase iterator. La clase diccionario es ...
  #1 (permalink)  
Antiguo 26/11/2014, 14:06
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
C++ error al acceder a miembro privado desde clase anidada y friend

El problema es el siguiente, tengo una clase llamada diccionario, en la que uso templates y tengo anidada la clase iterator. La clase diccionario es un tipo de objeto (no el de la STL pero parecido) con un vector (STL) de pair (STL), que contiene en el first un tipo key que no debe ser modificado, y en second que se corresponde con key y cuyos tipos varían gracias a los templates.

Clase diccionario en el fichero diccionario.h:
Código:
class diccionario;
Que contiene la clase anidada:
Código:
class iterator;
La cual está establecida como friend:
Código:
friend class iterator;
Dentro de la parte privada de la clase diccionario:
Código:
vector<entrada> dic;
Entrada se corresponde con:
Código:
typedef pair<Key, Def> entrada;
Ahora en el archivo diccionario.hxx (el cual está incluido correctamente en el .h y todo lo necesario...), tengo el siguiente método (el cual tiene su correspondiente cabecera en la parte pública de la clase anidada):

Código:
template <typename Key, typename Def> 
diccionario<Key,Def>::iterator::iterator( );
Este método debería crear un iterador que apunta al primer dato del vector privado de la clase padre.
Este puntero se guarda de la siguiente forma en la parte privada de la clase iterator:
Código:
pair<const Key, Def> * it_v;
Lo que quiero hacer en el método es algo como esto:
Código:
vector<pair<Key, Def>> dic2;
pair<const Key, Def> * it_v2 = (pair<const Key,Def> *) &dic2[0];
dic2 correspondería con el dato privado de la clase diccionario (el vector con la clave y el dato).
pair<const Key, Def> * it_v2 es it_v, de la parte privada de la clase anidada.
(pair<const Key,Def> *) es un casting ya que lo hemos declarado como constante en el iterador, pero el tipo de dato no estaba definido así.
&dic2[0] es &dic[0] la referencia que queremos devolver del dato mencionado anteriormente.
(Todo lo anterior funciona bien)
De modo que lo que quiero hacer es:
Código:
it_v = (pair<const Key,Def> *) &dic[0];
Peeeeero....
Cita:
g++ -o ejecV2 -D DICC_V2 -std=c++0x ejemplo.cpp -Iinclude
In file included from ejemplo.cpp:4:0:
diccionarioV2.hxx: In instantiation of ‘diccionario<Key, Def>::iterator::iterator() [with Key = std::basic_string<char>; Def = int]’:
ejemplo.cpp:112:35: required from here
diccionario.h:198:18: error: invalid use of non-static data member ‘diccionario<std::basic_string<char>, int>::dic’
In file included from diccionario.h:213:0,
from ejemplo.cpp:4:
diccionarioV2.hxx:296:7: error: from this location
make: *** [dic2] Error 1
El caso es que desde ese método no puedo acceder a dic (el vector) de ningún modo, esto también devuelve el mismo error:
Código:
Def a = dic.at(0).second;


No consigo acceder a los datos privados desde la clase amiga anidada, ¿alguien me ayuda?

Espero haberme expresado bien xD Gracias y un saludo.
  #2 (permalink)  
Antiguo 26/11/2014, 14:08
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

¿No puedes poner una parte mínima de código que permita reproducir tu problema?
  #3 (permalink)  
Antiguo 26/11/2014, 14:10
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

Has intentado resumirlo tanto que no se entiende nada.

¿Puedes poner el código de la función? Y la definición de la clase no iría mal.
  #4 (permalink)  
Antiguo 26/11/2014, 14:20
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

Disculpad, es que es larguillo y tengo muchas cosas... aquí lo dejo más claro:

diccionario.h:
Código C++:
Ver original
  1. template <typename Key, typename Def>
  2. class diccionario{  
  3. public:
  4.  
  5.   typedef pair<Key, Def> entrada;
  6.   typedef pair<const Key, Def> value_type;
  7.   typedef unsigned int size_type;
  8.   class iterator;
  9.  
  10.   diccionario( );
  11.  
  12.  
  13.   class iterator {
  14.   public:
  15.     iterator();
  16.  
  17.   private:
  18.     iterator (entrada * p);
  19.     iterator (typename vector<entrada>::iterator it);
  20.     friend class diccionario;
  21.     value_type * it_v;
  22.   };
  23.  
  24. private:
  25.        
  26.   friend class iterator;    
  27.   vector<entrada> dic; // vector que almacena los elementos del diccionario
  28. };

diccionarioV2.hxx:

Código C++:
Ver original
  1. template <typename Key, typename Def>
  2. diccionario<Key,Def>::iterator::iterator( ){
  3.      /*
  4.       Esto es lo mismo que lo de abajo, esto funciona y lo otro no
  5.       vector<pair<Key, Def>> dic2;
  6.       pair<const Key, Def> * it_v2 = (pair<const Key,Def> *) &dic2[0];
  7.       */
  8.  
  9.       it_v = (pair<const Key,Def> *) &dic[0];
  10.  
  11.       //Esto tampoco funciona...
  12.      // Def a = dic[0].second;
  13. }

Última edición por Lifka; 26/11/2014 a las 14:50
  #5 (permalink)  
Antiguo 26/11/2014, 16:06
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

En tu mensaje original dices:
Cita:
diccionario.h:198:18: error: invalid use of non-static data member ‘diccionario<std::basic_string<char>, int>::dic’
Así que si pusieras código que pudiera compilarse y que reprodujera ese error sería mejor.

Por otro lado, te comento con flechitas en el código alguna cosa que veo que me parece que no está bien, o que no entiendo para qué está...
Código:
    template <typename Key, typename Def>
    class diccionario{  
    public:
     
      typedef pair<Key, Def> entrada;
      typedef pair<const Key, Def> value_type;
      typedef unsigned int size_type;
      class iterator;    // -> ¿Para qué está esto?
     
      diccionario( );
     
     
      class iterator {   // ----> declaras el tipo iterator, pero no veo que tengas una variable de ese tipo en la clase
      public:
        iterator();
     
      private:
        iterator (entrada * p);
        iterator (typename vector<entrada>::iterator it);
        friend class diccionario;
        value_type * it_v;
      };
     
    private:
           
      friend class iterator;  // --> ¿por qué tiene que ser friend una clase incluída?  
      vector<entrada> dic; // vector que almacena los elementos del diccionario
    };
Pero bueno, si pusieras algo para compilar y ver dónde pasa lo que pasa, por ahí me llueve una idea.
  #6 (permalink)  
Antiguo 26/11/2014, 16:07
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 10 años
Puntos: 13
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

El error no tiene nada que ver con el miembro de ser privado. Todo el problema se puede simplificar a esta:

Código C++:
Ver original
  1. struct dicconario {
  2.   struct iterator{
  3.     iterator();
  4.   };
  5.   int dic;
  6. };
  7.  
  8. dicconario::iterator::iterator() {
  9.   int i = dic;
  10. }

dic no es miembro estático de diccionario así que tienes que tener un objeto diccionario para acceder a ella. El objeto iterador probablemente debería almacenar un miembro de diccionario*, pasado a cada uno de lo constructores
  #7 (permalink)  
Antiguo 26/11/2014, 16:14
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

El ejemplo que has pasado no sirve porque:

Código C++:
Ver original
  1. pair<const Key, Def> * it_v2 = (pair<const Key,Def> *) &dic2[0];

Aunque sea una clase anidada, "iterator" no sabe sobre qué instancia de "diccionario" está trabajando. Otra cosa es que "dic2" sea un método estático de "diccionario", pero salvo que a "iterator" le facilites un puntero o una referencia a una instancia de "diccionario" me temo que no vas a ser capaz de acceder de forma satisfactoria a los miembros de "diccionario" desde "iterator"
  #8 (permalink)  
Antiguo 26/11/2014, 16:53
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

Lareto, hay cosas a las que yo tampoco le veo mucha lógica, pero aclaro que las definiciones no son mías, y en teoría no debo modificarlas. Forman parte de un ejercicio. Aquí dejo parte -> https://mega.co.nz/#!l8MggTIS!p8O8SONVDQxwdVzHJpaRTiHNjIj0RZsftR5rW01 kWcs

kutcher, no puedo pasarle un parámetro a ese constructor, el ejercicio me obliga a hacerlo así.

Andaba bastante perdido ya que no comprendía que no tuviese acceso a la instancia... Gracias a vuestra explicación creo que ya se me ocurre como continuar! Muchas gracias.
  #9 (permalink)  
Antiguo 26/11/2014, 16:54
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: C++ error al acceder a miembro privado desde clase anidada y friend

Se envió duplicado

Etiquetas: char, clase, fichero, funcion, int, privado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:24.