Problema di referenced

di il
4 risposte

Problema di referenced

Ciao a tutti, il mio problema è molto semplice:
In Xcode, sto facendo un progetto per l'università, in c++, e ho diviso il programma nel classico MAIN.CPP, HEADER.H, FUNZIONI.CPP. Ora, non mi da errori sintattici, ma a run del programma succede che le funzioni non le trova, dicendomi che nel file .o del main non ci sono. Vi scrivo il codice così, potete avere un'idea.

//MAIN
#include "MatriceT.h"

int main(int argc, const char * argv[])
{
Matrice<int,5> M1(2,3);

Matrice<double,6> M2(1,4);

M1.AcquisciMatrice();

M2.AcquisciMatrice();

/*for(i=0;i<M1.getrighe();i++){
for(j=0;j<M1.getcolonne();j++)
cout<<i<<","<<j<<":"<<M1.leggimatrice(i,j)<<" ";
cout<<endl;
}*/

return 0;
}

//MatriceT.h

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

typedef int indice;

template<class T,int max>class Matrice
{

public:
typedef T tipoelem;
Matrice(indice,indice);
~Matrice();


void AcquisciMatrice();

void setrighe(indice);
void setcolonne(indice);
indice getrighe();
indice getcolonne();

//tipoelem leggimatrice(indice,indice);
void scrivimatrice(indice,indice,tipoelem);

private:
bool controlloindice(indice);
bool controllocasella(indice,indice);
indice righe;
indice colonne;
tipoelem **Mat;


};

//MatriceT.cpp
#include "MatriceT.h"

template <class T,int max> Matrice<T,max>::Matrice(indice r,indice c)
{
int i;
righe=r;
colonne=c;
Mat= new tipoelem* [r];
for(i=0;i<righe;i++)
Mat=new tipoelem [c];

}

template <class T,int max> Matrice<T,max>::~Matrice()
{
delete Mat;
}

template <class T,int max> void Matrice <T,max>::setrighe(indice r)
{
if(controlloindice(r))
righe=r;
else
righe=max;
}


template <class T,int max> void Matrice <T,max>::setcolonne(indice c)
{
if(controlloindice(c))
colonne=c;
else
colonne=max;
}


template <class T,int max> indice Matrice <T,max>::getrighe()
{
return righe;
}

template <class T,int max> indice Matrice <T,max>::getcolonne()
{
return colonne;
}


template <class T,int max> void Matrice <T,max>::scrivimatrice(indice r,indice c,tipoelem a)
{
if(controllocasella(r,c))
Mat[r][c]=a;
}

/*template <class T,int max> tipoelem Matrice<T,max>::leggimatrice(indice r,indice c)
{
if(controllocasella(r,c))
return Mat[r][c];
}*/

template <class T,int max> bool Matrice<T,max>::controllocasella(indice i,indice j)
{
if(i>max || j>max)
return false;
else
return true;
}

template <class T,int max> bool Matrice<T,max>::controlloindice(indice i)
{
if(i>max)
return false;
else return true;
}




template <class T,int max> void Matrice<T,max>::AcquisciMatrice()
{
int i,j;
tipoelem app;

for(i=0;i<getrighe();i++)
for(j=0;j<getcolonne();j++){
cout<<"Elemento["<<i<<"]["<<j<<"]:";
cin>>app;
scrivimatrice(i,j,app);
}
}

Sinceramente, so che c'è un problema in stack, perché viene compilato prima il main, quindi avrei bisogno di capire come fare.
GRAZIE PER L'ATTENZIONE.
Spero in una soluzione

4 Risposte

  • Re: Problema di referenced

    Metti i code tags che così non si capisce niente.
  • Re: Problema di referenced

    Ragione scusa...
    MatriceT.cpp
    
    #include "MatriceT.h"
    
    template <class T,int max> Matrice<T,max>::Matrice(indice r,indice c)
    {
        int i;
        righe=r;
        colonne=c;
        Mat= new tipoelem* [r];
        for(i=0;i<righe;i++)
            Mat[i]=new tipoelem [c];
        
    }
    
    template <class T,int max> Matrice<T,max>::~Matrice()
    {
        delete Mat;
    }
    
    template <class T,int max> void Matrice <T,max>::setrighe(indice r)
    {
        if(controlloindice(r))
            righe=r;
        else
            righe=max;
    }
    
    
    template <class T,int max> void Matrice <T,max>::setcolonne(indice c)
    {
        if(controlloindice(c))
            colonne=c;
        else
            colonne=max;
    }
    
    
    template <class T,int max> indice Matrice <T,max>::getrighe()
    {
        return righe;
    }
    
    template <class T,int max> indice Matrice <T,max>::getcolonne()
    {
        return colonne;
    }
    
    
    template <class T,int max> void Matrice <T,max>::scrivimatrice(indice r,indice c,tipoelem a)
    {
        if(controllocasella(r,c))
            Mat[r][c]=a;
    }
    
    /*template <class T,int max> tipoelem Matrice<T,max>::leggimatrice(indice r,indice c)
    {
        if(controllocasella(r,c))
            return Mat[r][c];
    }*/
    
    template <class T,int max> bool Matrice<T,max>::controllocasella(indice i,indice j)
    {
        if(i>max || j>max)
            return false;
        else
            return true;
    }
    
    template <class T,int max> bool Matrice<T,max>::controlloindice(indice i)
    {
        if(i>max)
            return false;
        else return true;
    }
    
    
    
    
    template <class T,int max> void Matrice<T,max>::AcquisciMatrice()
    {
        int i,j;
        tipoelem app;
        
        for(i=0;i<getrighe();i++)
            for(j=0;j<getcolonne();j++){
                cout<<"Elemento["<<i<<"]["<<j<<"]:";
                cin>>app;
                scrivimatrice(i,j,app);
            }
    }
    
    
    MatriceT.h
    
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    
    using namespace std;
    
    typedef int indice;
    
    
        
    
    template<class T,int max>class Matrice
    {
        
        public:
        typedef T tipoelem;
        Matrice(indice,indice);
        ~Matrice();
        
        
        void AcquisciMatrice();
        
        void setrighe(indice);
        void setcolonne(indice);
        indice getrighe();
        indice getcolonne();
        
        //tipoelem leggimatrice(indice,indice);
        void scrivimatrice(indice,indice,tipoelem);
        
        private:
        bool controlloindice(indice);
        bool controllocasella(indice,indice);
        indice righe;
        indice colonne;
        tipoelem **Mat;
        
        
    };
    
    main.cpp
    
    #include "MatriceT.h"
    
    
    int main(int argc, const char * argv[])
    {
        Matrice<int,5> M1(2,3);
        
        Matrice<double,6> M2(1,4);
        
        M1.AcquisciMatrice();
        
        M2.AcquisciMatrice();
        
        /*for(i=0;i<M1.getrighe();i++){
            for(j=0;j<M1.getcolonne();j++)
                cout<<i<<","<<j<<":"<<M1.leggimatrice(i,j)<<" ";
            cout<<endl;
        }*/
        
        return 0;
    }
    
    
  • Re: Problema di referenced

    I template devono stare tassativamente solo su header. quindi sia dichiarazione sia sviluppo devono essere messi su .h
    Non deve esistere un file cpp di sviluppo template. Da cui il tuo problema. XCode non considera lo sviluppo in cpp perche lo standard lo impedisce.
  • Re: Problema di referenced

    Grazie Immaginavo una cosa del genere Pensavo ci fosse una qualche istruzione che permettesse l'uso di un .cpp per le funzioni
Devi accedere o registrarti per scrivere nel forum
4 risposte