• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Marino

Preciso de ajuda erro no compilador

13 mensagens neste tópico

Boas pll, estou de novo com as calças na mão  :bye2:

tenho uma classe para criar:

imah2oo.th.jpg

mas aqui para declarar a funçao

imah26qx.th.jpg

da-me o seguinte erro com o Dev-C++, sei que ainda nao fiz o main etc e tal...

58  expected constructor, destructor, or type conversion before "CAssocList"

58 expected `;' before "CAssocList"

#include <iostream>
using namespace std;
// Exepçoes
void ChaveRepetida()
{
     cout<< "Chave Repetida"<< endl;
}

void ListaCheia()
{
     cout << "Lista Cheia" << endl;
}
//-------------------------------------------
template <class C,class D> class CAssocList {
         unsigned int max_assoc, num_assoc;
         C * chaves; D * dados;
public:
       CAssocList (unsigned int max_size);
       CAssocList (const CAssocList &a);
       ~CAssocList ();
       unsigned int size() const ;
       unsigned int capacity() const ;
       CAssocList &inserir(const C &chave, const D &dado);
       };
       
       
template <class C, class D> CAssocList<C,D>::CAssocList(unsigned int max_size)
{
         max_assoc=max_size;
         chaves[max_size];
         dados[max_size];
}

         
template <class C,class D> CAssocList<C,D>::CAssocList(const CAssocList &a)
{
         chaves[a.max_assoc];
         dados[a.max_assoc];
         max_assoc=a.max_assoc;
}

template <class C,class D> CAssocList<C,D>::~CAssocList()
{
         delete [] chaves;
         delete [] dados;
}

template <class C,class D> unsigned int CAssocList<C,D>::size() const
{
         return num_assoc;
}

template <class C,class D> unsigned int CAssocList<C,D>::capacity() const 
{
         return max_assoc;
}

template <class C,class D> CAssocList CAssocList<C,D>::&inserir(const C &chave, const D &dado) // <-- Erro nesta linha
{
         for(int i=0 ; i<=num_assoc ; i++) // EXCEPÇAO chave repetida
              {
                      if(chave[i]==chave) throw(ChaveRepetida())
              }
         if(num_assoc==max_assoc) throw(ListaCheia()); //PReciso de fazer Break???

else         
chave[++num_assoc]==chave;
dado[++num_assoc]==dado;

return *this;
}

         
         

Exprimentei compliar em linux e dá o mesmo erro e eu nao sei pq :confused:

Ajudem-me pois assim nao posso acabar o trabalho  :thumbsup:

Edit: esqueçam os comentario  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tu podes fazer isto?

CAssocList (unsigned int max_size);
       CAssocList (const CAssocList &a);
       ~CAssocList ();

tas a dizer que sao funcoes abstractas.... o construtor e o destrutor, classes abstractas....  :eek: acho que nao estou engadana, mas penso que nao podes fazer isso!!

e o teu erro tem mesmo a ver com os contrutores e destrutores....

e depois pode ter 2 funções com o mesmo nome, mas tem que diferir no numero de argumentos

CAssocList (unsigned int max_size);
       CAssocList (const CAssocList &a);

e ai nao esta a diferir... vai dar erro...

penso que nao estou enganada, por isso peço que verifiques e analises isso!!!  :dontgetit:

edit... tive a ver outra vez....e usas uma maneira de usar classes diferente da que eu aprendi e nao usei mto este modo....  nao tenho a certeza

if(num_assoc==max_assoc) throw(ListaCheia()); //PReciso de fazer Break??? 

nao é preciso break, entao tas a trabalhar com excepcoes... tipo "salta fora..."

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem que diferir no numero ou no tipo de algumentos, neste caso difere no tipo.

A declaração da class está bem, pois é do enunciado  :biggrin:

Agora quanto a ser abstrata e tal,nem se o que isso quer dizer  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem que diferir no numero ou no tipo de algumentos, neste caso difere no tipo.

A declaração da class está bem, pois é do enunciado  :biggrin:

Agora quanto a ser abstrata e tal,nem se o que isso quer dizer  :-[

nao tinha visto...pois realmente nao sei! devo estar a confudir...ja nao pego em classes a uns mesitos..lol 

e tas a fazer inicialmente a declaração.... hummmmm ....  :hmm:

mas de uma coisa tenho a certeza diferem no numero!!!

em relacao a o que é abstracto é que fazeres por exemplo :  unsigned int capacity() const =0;    (  eu confudi...  :-[  :-[  )

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na linha 58:

template <class C,class D> CAssocList CAssocList<C,D>::&inserir(const C &chave, const D &dado)

tens 2 problemas: tens que incluir a lista de argumentos no tipo da função (a vermelho), e o qualificador referência (&) tem que vir antes do nome da classe (a azul).

template <class C,class D> CAssocList<C,D> &CAssocList<C,D>::inserir(const C &chave, const D &dado)

Depois de alterar aquela linha, o VisualC++ não se queixou de mais nada.

Já agora, métodos abstractos não conheço... Conheço sim métodos virtuais, e classes abstractas :thumbsup:. E o que descreveste (unsigned int capacity() const =0;) foi um método virtual puro, que só pode ser declarado numa classe abstracta, e que tem que ser definido mais tarde por uma classe derivada.

Mesmo assim, esse tipo de métodos só são utilizados com polimorfismo, coisa que suponho que não seja o objectivo com a implementação de uma lista... ::confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era isso mesmo, eu sabia que estava qq coisa mal  :biggrin:

Muito obrigado mesmo  :cheesygrin:

Tofas obrigado pela rápida resposta também.

Se tiver mais dúvidas passojá por cá

Electro Power  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho aqui outra dúvida  :-[

está a dar erro na class derivada, PrettyPrintAssocList, e também deve ser uma coisa basica, mas q me está a escapar  :hmm:

#include <iostream>
using namespace std;
// Exepçoes
class ChaveRepetida{};
class ListaCheia{};
class ChaveInexistente{};

template <class C,class D> class CAssocList {
         unsigned int max_assoc, num_assoc;
         C * chaves; D * dados;
public:
       CAssocList (unsigned int max_size);
       CAssocList (const CAssocList &a);
       ~CAssocList ();
       unsigned int size() const ;
       unsigned int capacity() const ;
       CAssocList &inserir(const C &chave, const D &dado);
       CAssocList &eliminar(const C &chave);
       D &pesquisar (const C &chave) const;
       virtual void imprimir (std::ostream &os) const;
       D &operator[] (const C &chave);
       };
       
//Class PretyPrint      
template <class C , class D> class CPrettyPrintAssocList : public CAssocList<C,D> {
         public:
         virtual void imprimir(std::ostream &os) const;
         unsigned int size() const;
         };
template <class C , class D> void CPrettyPrintAssocList<C,D>::imprimir(std::ostream &os) const
{
         for(int i=0;i<=size(); i++)
         {
                 os << ++i << " (" << CAssocList<C,D>.chaves[i] << " " << CAssocList<C,D>.dados[i] << ")" << endl;  //<<---O que esta mal nesta linha??  
         }
}       
           
template <class C,class D> std::ostream &operator<<(std::ostream &os, const CAssocList <C, D> &a)
{
         a.imprimir(os);
         return os;
}
    
template <class C, class D> CAssocList<C,D>::CAssocList(unsigned int max_size)
{
         num_assoc=0;
         max_assoc=max_size;
         chaves = new C[max_size];
         dados = new D[max_size];
}

         
template <class C,class D> CAssocList<C,D>::CAssocList(const CAssocList &a)
{
         	
         chaves = new C[a.max_assoc];
         dados = new D[a.max_assoc];
         max_assoc=a.max_assoc;
         num_assoc=a.num_assoc;
         
}

template <class C,class D> CAssocList<C,D>::~CAssocList()
{
         delete [] chaves;
         delete [] dados;
}

template <class C,class D> unsigned int CAssocList<C,D>::size() const
{
         return num_assoc;
}

template <class C,class D> unsigned int CAssocList<C,D>::capacity() const 
{
         return max_assoc;
}

template <class C,class D> CAssocList<C,D> &CAssocList<C,D>::inserir(const C &chave, const D &dado)
{
      {
if(size()==max_assoc)
	throw ListaCheia();
for(int i=0;i<size();i++)
	if(chave==chaves[i])
		throw ChaveRepetida();

chaves[num_assoc]=chave;
dados[num_assoc]=dado;
num_assoc++;

return *this;
    }      
}


template <class C,class D> CAssocList<C,D> &CAssocList<C,D>::eliminar(const C &chave)
{
            for(int i=0; i<=size();i++)
            {
                    if(chaves[i]==chave)
                    {
                     for(int aux=(i+1);aux<=num_assoc;aux++,i++)
                     {
                             chaves[aux]=chaves[i];
                     }
                     num_assoc--;
                     return *this;
                    }
            }
            throw(ChaveInexistente());
}

template <class C,class D> D &CAssocList<C,D>::pesquisar(const C &chave) const
{
for(int i=0;i<size();i++)
	if(chaves[i]==chave)
		return dados[i];
throw ChaveInexistente();
}

template <class C,class D> D &CAssocList<C,D>::operator[](const C &chave)
{
         
         return pesquisar(chave);
}

template <class C,class D> void CAssocList<C,D>::imprimir(std::ostream &os) const
{
for(int i=0;i<=num_assoc;i++)
{
         os << chaves[i] << " " << dados[i] << endl;
}

}        

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No meu compilou  :thumbsup:

Experimenta usar namespace.

Pois no início, depois dos include:

using namespace std;

E depois eliminas tudo o que tens std::

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dá o erro

34  expected primary-expression before '.' token

mesmo tirando a std::

é naquela linha onde tenho o comentario, a sintaxe está correcta? eu penso que sim

Já agora, isto é um .h, depois tenho cpp ... mesmo fazendo um cpp com este codigo com o dev c++ dá este erro, em linux nao testei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na linha 34 tens:

os << ++i << " (" << CAssocList<C,D>.chaves[i] << " " << CAssocList<C,D>.dados[i] << ")" << endl;

estás a tentar aceder aos membros da classe CAssocList, em vez de aceder aos membros de um objecto dessa classe; por outro lado, declaraste esses membros na classe CAssocList como private, e assim sendo não tens acesso a eles nos métodos da classe CPrettyPrintAssocList. Se os tornares protected na CAssocList e escreveres aquela linha como

os << ++i << " (" << chaves[i] << " " << dados[i] << ")" << endl;

já não deve dar erros.

Já agora, não te esqueças que não tens construtores na classe CPrettyPrintAssocList, e os construtores não são hereditários. Tens também o método size() declarado em ambas as classes; este método não é virtual, logo só podes declará-lo na classe "mãe".

Toma também atenção aos warnings que aparecem: declara as variáveis i dos fors como unsigned int; pode não ser grave para números pequenos, mas é sempre melhor precaver erros futuros :D

No meu compilou  :D

Experimenta declarar um objecto da classe CPrettyPrintAssocList.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não posso mudar para protected  :D

Qnto ao size(), era mesmo para ver de onde vem tal erro.

Se puderes dar uma ideia como acedo aos objectos privados. No construtor do Pretty..List  nao posso fazer uma cópia dos vectores chaves e dados?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Está certo, TheDark tem razão. Não olhei bem para o código, por isso fiz uma mal a análise do código :-[

Não posso mudar para protected  :D

Qnto ao size(), era mesmo para ver de onde vem tal erro.

Se puderes dar uma ideia como acedo aos objectos privados. No construtor do Pretty..List  nao posso fazer uma cópia dos vectores chaves e dados?

Eu não tenho a certeza, mas acho que não tens mesmo acesso aos objectos privados. A única maneira de teres acesso aos objectos privados é de modo inderecto, criando um método na classe CAssocList que devolve os valores dos objectos. E outros métodos para alterar os valores dos objectos privados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não tenho a certeza, mas acho que não tens mesmo acesso aos objectos privados. A única maneira de teres acesso aos objectos privados é de modo inderecto, criando um método na classe CAssocList que devolve os valores dos objectos. E outros métodos para alterar os valores dos objectos privados.

Concordo plenamente. E se criares esses métodos como protected, só a própria classe e as derivadas directas terão acesso a alterar os valores, logo não há problema de acessos indevidos :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora