Ir para o conteúdo
esfomeado

Problema com colecao hibrida c++

Mensagens Recomendadas

esfomeado

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

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


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
esfomeado

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
esfomeado

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 :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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 :P

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

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.