[C con Clase] Otra duda

Salvador Pozo salvador en conclase.net
Jue Mar 13 16:44:37 CET 2014


Hola, de nuevo:

Estoy intentando averiguar el objeto del código del mensaje anterior, pero me pierdo en esta función:

    void almacenar(A test,int n){
        while(n=!1){
            A *test=new A;
            v.push_back(*list);*
            delete test;
        }
    }

Creas un objeto "test" dentro del bucle while, cuando ya existe un "test" que es el parámetro que pasas a "almacenar". Esta segunda declaración oculta la del parámetro, que queda inaccesible.

De todos modos, no usas "test" en ningún lugar, salvo para crear el objeto y destruirlo.

Introduces en un vector "v", que no ha sido declarado, un valor que extraes del vector list. Ignoro el objeto de esto.

El bucle "while(n=!1)", no tiene sentido. Si es "while(n!=1)", hay dos posibles resultados. O bien es un bucle infinito, cuando n sea distinto de 1, o  no se ejecuta nunca, cuando n sea 1. En cualquier caso, n es un parámetro, y en ningún momento se modifica su valor.

Entiendo que hay errores en este código, y el el parámetro test es un array normal de n elementos, que deben ser introducidos en el vector "list".

Dicho sea de paso, usar "list" como identificador puede ser mala idea, porque es otro de los tipos definidos en stl, usaré "lista" en su lugar.

Así pues, estabas accediendo correctamente a los elementos de la lista. El error estaba en el bucle:

----8<------
#include <iostream>
#include <vector>

using namespace std;

class A {
  public:
    string getA() const {return a;}
    void ver(){cout<<"la palabra es : "<<getA()<<endl;}
  private:
    string a;
};

class B{
  public:
    void almacenar(A* test,int n){
        for(int i=0; i<n; i++){
            lista.push_back(&test[i]);
        }
    }
    void imprimir(){
        // acceder al metodo ver de la clase A
        for(unsigned int p=1; p<lista.size();p++){
            lista[p]-> ver();
        }
    }
  private:
    vector<A*> lista;
};

int main() {
    A t[10];
    B b;

    b.almacenar(t,10);
    b.imprimir();
}
----8<------

MAj> Bueno finalmente hice algo como esto en la funcion para leer los datos:
MAj> for(auto &p : list){
MAj> p->ver();

Esta opción funciona usando un compilador que adminta C++11.

A mi modo de ver es más elegante, y una vez que se entiende la sintaxis de "auto", más fácil de entender su funcionamiento.

Añadir que este tipo de bucles for sólo funciona si la clase tiene iteradores, como es el caso de "vector" o "array". No sirve para recorrer, por ejemplo, arrays agregados normales.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net


Más información sobre la lista de distribución Cconclase