Jump to content

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


Recommended Posts

Posted

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

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;
}

         
         

Experimentei compilar em linux e dá o mesmo erro e eu não sei pq 😕

Ajudem-me pois assim não posso acabar o trabalho  👍

Edit: esqueçam os comentario  😁

Posted

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....  ? 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..."

Posted

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  😁

Agora quanto a ser abstrata e tal,nem se o que isso quer dizer  ?

Posted

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  😁

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 ....  ?

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...  ?  ?  )

Posted

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 👍 . 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... :😕

Desaparecido.

Posted

Era isso mesmo, eu sabia que estava qq coisa mal  😁

Muito obrigado mesmo  😁

Tofas obrigado pela rápida resposta também.

Se tiver mais dúvidas passojá por cá

Electro Power  👍

Posted

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  ?

#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;
}

}        
Posted

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.

Posted

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 😄

No meu compilou  😄

Experimenta declarar um objecto da classe CPrettyPrintAssocList.

Desaparecido.

Posted

Não posso mudar para protected  😄

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?

Posted

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  😄

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.

Posted

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 😄

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.