Marino Posted April 22, 2006 at 04:35 PM Report #23607 Posted April 22, 2006 at 04:35 PM 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 😁
saramgsilva Posted April 22, 2006 at 04:46 PM Report #23609 Posted April 22, 2006 at 04:46 PM 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..." www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
Marino Posted April 22, 2006 at 04:52 PM Author Report #23610 Posted April 22, 2006 at 04:52 PM 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 ?
saramgsilva Posted April 22, 2006 at 05:11 PM Report #23611 Posted April 22, 2006 at 05:11 PM 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... ? ? ) www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
TheDark Posted April 22, 2006 at 05:22 PM Report #23615 Posted April 22, 2006 at 05:22 PM 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.
Marino Posted April 22, 2006 at 05:30 PM Author Report #23620 Posted April 22, 2006 at 05:30 PM 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 👍
Marino Posted April 22, 2006 at 09:25 PM Author Report #23696 Posted April 22, 2006 at 09:25 PM 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; } }
brink@ero Posted April 22, 2006 at 09:40 PM Report #23700 Posted April 22, 2006 at 09:40 PM No meu compilou 👍 Experimenta usar namespace. Pois no início, depois dos include: using namespace std; E depois eliminas tudo o que tens std::
Marino Posted April 22, 2006 at 09:45 PM Author Report #23701 Posted April 22, 2006 at 09:45 PM 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.
TheDark Posted April 23, 2006 at 01:38 AM Report #23729 Posted April 23, 2006 at 01:38 AM 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.
Marino Posted April 23, 2006 at 07:28 AM Author Report #23745 Posted April 23, 2006 at 07:28 AM 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?
brink@ero Posted April 23, 2006 at 11:16 AM Report #23757 Posted April 23, 2006 at 11:16 AM 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.
TheDark Posted April 23, 2006 at 10:04 PM Report #23878 Posted April 23, 2006 at 10:04 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now