Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) por que o new não funciona?


kuroi

Pergunta

aqui no meu projeto do dev c++ (pra windows) tenho uma classe q tem o seguinte metodo:

public : opcao* NovaOpcao(area* ax, SDL_Surface* h, int offx, int offy)
{            
    opcao* r;          
              
    if (ooo == NULL) //Primeira área a ser adicionada.
    {
//        ooo = (lista_ligada<opcao>*)malloc(sizeof(lista_ligada<opcao>));
        ooo = new lista_ligada<opcao>;  //<-- não FUNCIONA
        ooo->item = opcao(ax, h, offx, offy);
        ooo->l = NULL;
        qtde = 1;
        
        //ColocaFoco(&(ooo->item));
        foco = &(ooo->item);
        
        r = &(ooo->item);
    }
    else
    {
        lista_ligada<opcao>* ppp = ooo;
        while (ppp->l != NULL)
        {
            ppp = ppp->l;
        }
//        ppp->l = (lista_ligada<opcao>*)malloc(sizeof(lista_ligada<opcao>));
        ppp->l = new lista_ligada<opcao>;   //<-- não FUNCIONA
        ppp->l->item = opcao(ax, h, offx, offy);
        ppp->l->l = NULL;
        qtde++;
        
        r = &(ppp->l->item);
    }
    
    return r;
}[/code] o ooo esta declarado assim:
[code]protected : lista_ligada<opcao>* ooo;
porque não consigo alocar o espaco com o new nas duas linhas mostradas?? a estrutura da lista ligada é a seguinte:
template <class T>
typedef struct lista_ligada
{
    T item;
    lista_ligada* l;
};[/code] ele diz q:
no matching function for call to `lista_ligada<opcao>::lista_ligada()' candidates are: lista_ligada<opcao>::lista_ligada(const lista_ligada<opcao>&)
se eu faco com o malloc (linha comentada logo acima da linha do erro) da tudo certo. sei q o template não tem nd a ver, mas acho q o problema ta na classe opcao, porque se eu passo qualquer outra classe pro template da lista ligada funciona normal. inclusive numa outra classe tenho essa mesma lista ligada com um metodo q faz essa alocacao tb, so q pra uma classe diferente da classe opcao e funciona normal. tentei de teste criar uma lista exclusiva pra classe opcao:
[code]typedef struct lista_opcoes
{
    opcao o;
    lista_opcoes* l;
};
declarar o ooo como pontiero desse struct e fazer a alocacao com o new, mas deu o mesmo erro. a definicao da classe opcao é a seguinte:
class opcao
{
    public : area* Area; //Área da tela onde está a opção.
    
    public : opcao* Baixo; //Para qual opção irá ao ser pressionado para baixo.
    public : opcao* Cima; //Para qual opção irá ao ser pressionado para cima.
    public : opcao* Esquerda; //Para qual opção irá ao ser pressionado para a esquerda.
    public : opcao* Direita; //Para qual opção irá ao ser pressionado para a direita.
    
    //Para alinhar o highlight à área.
    public : int offset_x;
    public : int offset_y;
    
    public : SDL_Surface* highlight_img; //Imagem que circundará a opção em highlight;
    
    public : opcao(area* ax, SDL_Surface* h, int offx, int offy)
    {
        Area = ax;        
        highlight_img = h;
        
        offset_x = offx;
        offset_y = offy;
        
        Baixo = NULL;
        Cima = NULL;
        Esquerda = NULL;
        Direita = NULL;
    }
    ~opcao()
    {
    }
};[/code]

sera q o monte de ponteiro pra mesma classe dentro dela mesma tem algo a ver??

bom, não sei se alguém vai saber resolver, de qualquer modo ele funciona td certinho com o malloc(), mas sempre me falaram q devo usar new e não malloc(), e queria saber por q motivo o new não esta funcionando...

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Quando você utilizou o operador new, o compilador não somente alocou memória para os ítens da lista_ligada como também os instanciou.

No entanto, não havia um construtor para a classe opcao que não recebia nenhum parâmetro e, ao instanciar a classe, foi procurado um construtor assim.

Uma possível solução seria criar um construtor que não recebe parâmetros ou utilizar o malloc mesmo.

Link para o comentário
Compartilhar em outros sites

  • 0

é verdade, já tinha lido q o new chama o construtor mas não tinha pensado nisso nesse caso.

então eu tenho q fazer um overload do construtor sem parametros, certo?? depois eu testo aqui...

so o ruim é q ele vai chamar o codigo do construtor duas vezes, mas acho q no meu caso isso não vai interferir tanto no desempenho, valeu jonathan.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...