1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema com queue em C++

Discussão em 'Programação' iniciada por OubeLa, 10 de Dezembro de 2007. (Respostas: 3; Visualizações: 1121)

  1. OubeLa

    OubeLa Power Member

    Função que insere clientes de vários tipos numa queue (alias, em duas),

    Código:
    void Cantina::menu_colocaCliente()
    {
        string num, nome, fac, dep, curso, r;
        cout << "Que tipo de cliente e'?" << endl
            << "1 - Professor" << endl << "2 - Aluno" << endl << "3 - Anonimo" << endl << endl;
    
        fflush(stdin);
        getline(cin, num);
    
        cout << "E' prioritario? (s/n): ";
        getline(cin, r);
        cout << endl;
    
        if (r == "s")
            r = "sim";
    
        else if (r == "n")
            r = "nao";
    
        if (num == "3") {
            nome = "Anonimo";
            Cliente a("Anonimo", "Anonimo", r);
            a.setCodigo(++num_clientes);
    
            if (r == "sim")
                clientes_prioritarios.push(&a);
    
            else if (r == "nao")
                clientes_normais.push(&a);
        }
    
    
        else 
        {
            cout << endl << "Nome do cliente: ";
            cin >> nome;
            
            cout << endl << "Faculdade: ";
            cin >> fac;
    
            if (num == "1") {
                cout << endl << "Departamento: ";
                cin >> dep;
    
                Professor prof(nome, "Prof", r, fac, dep);
                prof.setCodigo(++num_clientes);
                
                if (r == "sim")
                    clientes_prioritarios.push(&prof);
    
                else if (r == "nao")
                    clientes_normais.push(&prof);
            }
    
    
            else if (num == "2") {
                cout << endl << "Curso: ";
                cin >> curso;
    
                Aluno aluno(nome, "aluno", r, fac, curso);
                aluno.setCodigo(++num_clientes);
                
                if (r == "sim")
                    clientes_prioritarios.push(&aluno);
    
                else if (r == "nao")
                    clientes_normais.push(&aluno);
    
            }
        }
    }
    
    Se noutra função qualquer tentar fazer display do primeiro elemento, por exemplo assim:

    Código:
    void Cantina::verFila()
    {
    
        (*(clientes_prioritarios.front())).getInfo();
    
        //cout << clientes_prioritarios.size() << endl;
    }
    
    Dá erro ao ver o primeiro elemento. Compila, só que depois se no meu programa escolher a opção para adicionar clientes (a primeira função), e se depois de inserir escolher a opção de ver a fila, dá este erro (mesmo que escolha um cliente como sendo prioritario).

    O mais estranho é que se fizer clientes_prioritarios.size() dá o valor certo, mas não consegue apresentar o primeiro elemente porque supostamente esta fazia.
    Se criar um cliente e o adicionar à fila naquela mesma função, já não há problemas. Agradecia ajuda.

    EDIT: é claro que ainda nem fiz verificações de dados, mas isso vou fazer depois porque agora queria mesmo resolver isto, que me estar a impedir de avançar no projecto.
     
    Última edição: 10 de Dezembro de 2007
  2. Consu

    Consu Power Member

    Não estive a ler com muito cuidado, mas julgo que o que se passa é que crias um Cliente nesse método:
    Código:
    Cliente a("Anonimo", "Anonimo", r);
    
    Se reparares o cliente é uma variável local, variável essa que desaparece a partir do momento em que sais da função. Como apenas guardas um apontador, esse apontador refere uma posição de memória que já não tem significado para o programa.
    Das duas uma, ou tens uma queue de Clientes, ou usas na mesma Cliente* mas fazes alocação dinâmica de memória.
    Se bem me recordo isto deve vir no seguimento do polimorfismo que te tinha referido, por isso acho que tens mesmo de fazer alocação dinâmica.

    Nota: Se alocas não te esqueças de libertar. :p

    (*(clientes_prioritarios.front())).getInfo(); = (clientes_prioritarios.front())->getInfo(); ;)
     
    Última edição: 10 de Dezembro de 2007
  3. OubeLa

    OubeLa Power Member

    Obrigadão (mais uma vez XD), é isso mesmo ;)
     
  4. Consu

    Consu Power Member

    Ainda bem que era disso, senão ia ter que ter que ver o resto do código.:x2:
     

Partilhar esta Página