[c++] problema coda con priorità

di il
4 risposte

[c++] problema coda con priorità

Ciao a tutti, sono nuovo del forum.
Ho un problema con la coda con priorità in c++ e spero possiate aiutarmi. Il problema è il seguente: non riesco ad utilizzarla! Nel senso che ho provato a includerla nel file principale del progetto e a dichiarare una variabile con tipo il nome della coda ma mi da due undefined references...

la coda è questa:

CodaP.cpp
#include "CodaP.h"

template<class T>CodaP<T>::CodaP():MAXLUN(100)
{
    heap=new _tipoelem[MAXLUN];
    creaPrioriCoda();
};

template<class T>CodaP<T>::CodaP(int maxN):MAXLUN(maxN)
{
    heap=new _tipoelem[MAXLUN];
    creaPrioriCoda();
};

template<class T>CodaP<T>::~CodaP()
{
    delete[] heap;

};

template<class T>void CodaP<T>::creaPrioriCoda()
{
    ultimo = 0;
};


template<class T>void CodaP<T>::inserisci(_tipoelem e)
{
	assert(ultimo<MAXLUN);
	heap[++ultimo-1]=e;
	fixUp();
};

template<class T>typename CodaP<T>::_tipoelem CodaP<T>::min()
{
    assert(ultimo!=0);
    return(heap[0]);
};

template<class T>void CodaP<T>::cancellaMin()
{
    assert(ultimo!=0);
    heap[0]=heap[ultimo-1];
    ultimo--;
    fixDown(1,ultimo);
};

template<class T>void CodaP<T>::fixUp()
{
    int k=ultimo;
    while(k>1 && heap[k-1] < heap[k/2-1])
    {
        _tipoelem tmp;
        tmp=heap[k-1];
        heap[k-1]=heap[k/2-1];

        heap[k/2-1]=tmp;
        k=k/2;
    }
}

template<class T>void CodaP<T>::fixDown(int k, int N)
{
    short int scambio=1;
    while(k<=N/2 && scambio)
    {
        int j=2*k;
        _tipoelem tmp;
        if(j<N && heap[j-1]>heap[j]) j++;
        if(scambio=(heap[j-1]<heap[k-1]))
        {
            tmp=heap[k-1];
            heap[k-1]=heap[j-1];
            heap[j-1]=tmp;
            k=j;
        }
    }
};
CodaP.h
#ifndef codap
#define codap
#include <cassert>
#include <iostream>
using namespace std;

template<typename T>class CodaP
{

public:
    typedef T _tipoelem;
    CodaP();
    CodaP(int);
    ~CodaP();

    void creaPrioriCoda();
    void inserisci(_tipoelem);
    _tipoelem min();
    void cancellaMin();

private:
    int MAXLUN;
    _tipoelem *heap;
    int ultimo;
    void fixUp();
    void fixDown(int,int);
};

#endif // CODAP

nel file che include anche altre strutture ho messo:
#include "CodaP.h"
e dichiarato questa variabile:
CodaP<string> coda;
dove sbaglio?

4 Risposte

  • Re: [c++] problema coda con priorità

    Nessuno sa aiutarmi?:(
  • Re: [c++] problema coda con priorità

    Cosa sapiamo delle template? Che devono essere inline e cioè lo sviluppo dev'essere fatto nel .h e non deve esistere un .cpp.
    Quindi sposti lo sviluppo delle funzioni nel header e lo puoi chiamare nel main come al solito e cioè
    
    CodaP<int> coda(120);
    
  • Re: [c++] problema coda con priorità

    Grazie mille, purtroppo non ho molta pratica con le strutture dati, ho iniziato da poco per un progetto universitario.
    A questo punto vi pongo un altro problema, conosco la causa ma non so come risolverlo.
    Ho un progetto con tante classi, una di queste riguarda l'interfaccia e contiene metodi come "leggi intero", "leggi stringa", "scrivi", ecc ecc, in modo da evitare di scrivere tante volte le stesse istruzioni.
    Quando lo si esegue(è un gioco testuale), viene chiesto sempre al giocatore cosa deve fare e il giocatore scrive l'azione.
    Io ho creato una funzione che deve gestire l'inserimento di alcuni ingranaggi negli appositi spazi e funziona, il problema è che quando esce dalla funzione mi stampa due volte la scritta cosa devo fare( presente in leggi_comando)...la causa del problema è il richiamo del metodo "leggi intero". Questo metodo nella mia funzione lo richiamo tre volte, ho provato a non usarlo, impostando direttamente io i valori e in questo modo non da problemi, ma a me serve leggerli in input tramite leggi intero.
    questi sono alcuni metodi della classe interfaccia:
    void Interfaccia::scrivi(string testo)
    {
        cout << testo << endl;
    }
    int Interfaccia::leggi_intero(string domanda)
    {
        int risposta;
    
        cout << domanda << endl;
        cin >> risposta;
        return risposta;
    }
    
    string Interfaccia::leggi_stringa(string domanda)
    {
        string risposta;
        cout << domanda << endl;
        cin >> risposta;
        return risposta;
    }
    
    string Interfaccia::leggi_comando()
    {
        string risposta;
        do
        {
            cout << "Cosa devo fare?" << endl;
            getline(cin, risposta);
        }
        while (risposta[0] == '\0');
        cout << endl;
        return risposta;
    }
    nella funzione in cui gestisco gli ingranaggi uso interfaccia.scrivi e interfaccia.leggi_intero. La cosa strana è che comunque funzionano, ma mi da il problema che una volta che esce dalla funzione mi stampa due volte il cosa devo fare.
    spero di essere stato chiaro
  • Re: [c++] problema coda con priorità

    Altro problema, più grave del precedente in quanto qui ho proprio un errore durante la compilazione e di conseguenza mi blocca...
    innanzitutto nel file principale ho creato la prioricoda:
    coda.creaPrioriCoda();
    quindi l'ho caricata tramite un'altra funzione:
    carica_prioricoda();

    void Gioco::carica_prioricoda()
    {
    coda.inserisci("primo");
    coda.inserisci("secondo");
    coda.inserisci("terzo");
    coda.inserisci("quarto");
    coda.inserisci("quinto");
    coda.inserisci("sesto");
    }

    ora volevo fare una prova...cioè volevo fare un ciclo in cui stampare il minimo ed eliminarlo dalla coda...ho fatto in questo modo:

    while(coda.ultimo!=0)
    {
    interfaccia.scrivi(coda.min());
    coda.cancellaMin();
    }

    (chiaramente per farlo ho dovuto spostare ultimo nella parte pubblica della classe) ma mi da due errori..su coda.cancellaMin(); mi dice: "required from here".
    mentre su fixDown(1,ultimo); nel metodo "cancellaMin" mi dice: required from 'void CodaP<T>::cancellaMin() [with T = std::basic_string<char>]'

    aiuto...sto impazzendo, non riesco a capire quale sia l'errore
Devi accedere o registrarti per scrivere nel forum
4 risposte