Jump to content

Problema com colecao hibrida c++


esfomeado

Recommended Posts

Para um trabalho da escola tenho que fazer um colecao hibrida que guarda jogadores!

O problema é quando vou para fazer um "print" de todos os jogadores da colecao apenas é mostrado o 1º.

Codigo para add a colecao:

Jogador *j = new Jogador(num, nome, sbase);
return jogadores.insert(j);

Codigo para mostrar todos os jogadores:

ColecaoHibrida<Jogador*>::iterator it;
for(it = jogadores.begin(); it != jogadores.end(); it++)
(*it)->print();

Alguem sabe qual sera o problema?

Link to comment
Share on other sites

nenhuma das linhas de código apresentadas é necessária.

a questão era sobre uma classe template algo que não apresentaste ...

///////////////ColecaoHibrida.h (vrs. 18/Nov/12)////////////////
#pragma once
#include<set>

using namespace std;

template<class T>
class less_pointers
{
public:
bool operator()(const T &left, const T &right) const
{
return (*left < *right);
}
};

template<class K>
class ColecaoHibrida: public set<K, less_pointers<K>>
{
public:
bool insert(const K &c);
K find(const K &c);
int size() const;
void erase(const K &);
//void clear();
//bool empty() const;
//iterator begin();
//iterator end();
};

template<class K>
bool ColecaoHibrida<K>::insert(const K &c)
{
pair<set<K, less_pointers<K>>::iterator, bool> r=set<K, less_pointers<K>>::insert(c);
return(r.second);
}

template<class K>
K ColecaoHibrida<K>::find(const K &c)
{
K r=0;
set<K, less_pointers<K>>::iterator i=set<K, less_pointers<K>>::find(c);
if(i!=set<K, less_pointers<K>>::end())
r=*i;
return(r);
}

template<class K>
int ColecaoHibrida<K>::size() const{
return((int)set<K, less_pointers<K>>::size());
}

template<class K>
void ColecaoHibrida<K>::erase(const K &c ) {
set<K, less_pointers<K>>::erase(c);
}

Link to comment
Share on other sites

antes do mais, não necessitas de redefinir todas essas funções da classe set. elas já estão implementadas.

segundo, verifica se não estás a inserir elementos com o mesmo key

exemplo:

#include <iostream>
#include <set>
using namespace std;

template<class T>
class less_pointers
{    
public:
   bool operator()(const T &left, const T &right) const
   {
       return (*left < *right);
   }
};

template<class K>
class ColecaoHibrida: public set<K, less_pointers<K> > { };

class Teste
{
public:
   int key;
   int value;

   Teste(int key, int value) : key(key), value(value) {}

   int getKey() { return key; }
   int getValue() { return value; }

   bool operator<(const Teste& t) {return this->key < t.key;}
};

int main()
{
   ColecaoHibrida<Teste *> c;

   c.insert(new Teste(1, 2));    // OK
   c.insert(new Teste(2, 20));   // OK
   c.insert(new Teste(3, 202));  // OK
   c.insert(new Teste(4, 2020)); // OK
   c.insert(new Teste(2, 30));   // ERROR : DUPLICATE KEY

   for (ColecaoHibrida<Teste *>::iterator iter = c.begin(); iter != c.end(); iter++)
   {
       cout << "Teste key = " << (*iter)->getKey() << " | value = " << (*iter)->getValue() << endl;
   }

   return 0;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

ok ... estive a ver as tuas funções (ou dadas pelo professor) e vi um erro.

é um problema chato e é normalmente esquecido pelas pessoas que programam em C++

1º de tudo nem sei como isso compila ... o código como está não compila, ponto.

agora os erros:

// a declaração de templates dentro de templates necessita de espaços por senão estas a escrever o right-shift-logical
if(i!=set<K, less_pointers<K> >::end())
//                           A
//                           | tem que levar um espaço !!!

// agora o mais complicado
// para o compilador, quando fazes "Class::xpto", ele pensa que estás a aceder a um parâmetro da classe
// por outra palavras, ele não interpreta isto como um tipo de dados
// é o que tens quando fazes:
set<K, less_pointers<K> >::iterator i;

// set<K, less_pointers<K> >::iterator não é considerado como um tipo, mas como aceder a um parâmetro da classe

// para resolver este tipo de problemas, existe uma palavra reservada "typename" que indica que a declaração seguinte é um tipo de dados

typename set<K, less_pointers<K> >::iterator i;
//  A
//  | declarar que o ::iterator é um tipo de dados

// é isso que tens de adicionar dentro das funções, sempre que declaras uma classe iterador

se depois de corriguir isto, e mesmo assim continuares a ter o mesmo problema, o erro está noutro local

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

O codigo com ou sem isso compila na mesma perfeitamente e o problema ainda continua.

Se quiseres e tiveres algum tempo disponivel poderei-te enviar o projecto todo para dares uma vista de olhos 😛

se compila, tens um problema de compilador (que pelo código apresentado é o VSC++) ...

se tens então o código, mete-o num dropbox ou outra coisa que eu dou uma vista de olhos ...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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.