Ir ao conteúdo
  • Cadastre-se
nanquinote

Sobrecarga de funcoes

Recommended Posts

Boa noite, tenho um menu que está chamando funções muito parecidas e queria saber se tem alguma forma de eu não precisar definir todas. Sou iniciante e não estou entendendo muito bem os textos que achei sobre isso na internet. 

Vou colocar só parte do código porque está muito grande e incompleto:

 

	cout << "\n1 - Busca por titulo" << endl;
	cout << "\n2 - Busca por AUTOR " << endl;
	cout << "\n3 - Busca por CODIGO" << endl;
	cout << "\n4 - Voltar" << endl;
	cin >> op;

(...)

int buscaTitulo(dLivros l[], string titulo, int q){
	for(int i=0; i<q; i++){
		if(titulo == l[i].titulo){ //ISSO TEM QUE SER VARIAVEL QUE MUDAR DE ACORDO COM O MEMBRO DA STRUCT
			return i;
		}
	}
	return -1;
}

int buscaAutor()

 

Tem como eu criar só uma função e, através dos argumentos, mudar o membro da struct comparado (título, autor, código)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poderia colocar um novo parametro que indica qual membro ser comparado, e na função fazer um switch.

Tipo, manda um int e para cada membro você define um valor.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O ponteiro da struct é o ponteiro do primeiro byte de dados contido nela, se converte a struct para o tipo byte (char) é possível se mover pelos campos como se fosse um vetor de bytes (char)

/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>
#define PRIMEIRO 0
#define DO_MEIO 20
#define ULTIMO (DO_MEIO + 25)

struct nome {
    char primeiro[20];  //Tamanho 20 bytes
    char domeio[25];    //Tamanho 25 bytes
    char ultimo[20];    //Tamnho  20 bytes
    int  idade;         //Tamanho 04 bytes total 69 bytes.
};

void show(const struct nome* base, const unsigned point);

/** Função principal que abre o programa */
int main(void)
{
    struct nome meunome = {"Fulano", "Beltrano", "de Tal", 20};

        show(&meunome, PRIMEIRO);
        show(&meunome,  DO_MEIO);
        show(&meunome,   ULTIMO);

        printf("Idade: %d\n", *( 68 + ((char*)&meunome)));
        printf("Idade: %d\n", meunome.idade);
        return 0;
}

void show(const struct nome* base, const unsigned point)
{
        printf("Aparti de point: %s\n\n", point + ((char*)base));
        return;
}

Ainda sim o companheiro @MassakiMsk nos deu um solução bem mais simples.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

O ponteiro da struct é o ponteiro do primeiro byte de dados contido nela, se converte a struct para o tipo byte (char) é possível se mover pelos campos como se fosse um vetor de bytes (char)


/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>
#define PRIMEIRO 0
#define DO_MEIO 20
#define ULTIMO (DO_MEIO + 25)

struct nome {
    char primeiro[20];  //Tamanho 20 bytes
    char domeio[25];    //Tamanho 25 bytes
    char ultimo[20];    //Tamnho  20 bytes
    int  idade;         //Tamanho 04 bytes total 69 bytes.
};

void show(const struct nome* base, const unsigned point);

/** Função principal que abre o programa */
int main(void)
{
    struct nome meunome = {"Fulano", "Beltrano", "de Tal", 20};

        show(&meunome, PRIMEIRO);
        show(&meunome,  DO_MEIO);
        show(&meunome,   ULTIMO);

        printf("Idade: %d\n", *( 68 + ((char*)&meunome)));
        printf("Idade: %d\n", meunome.idade);
        return 0;
}

void show(const struct nome* base, const unsigned point)
{
        printf("Aparti de point: %s\n\n", point + ((char*)base));
        return;
}

Ainda sim o companheiro @MassakiMsk nos deu um solução bem mais simples.

 

 

@Mauro Britivaldo Ja existe uma função para isso... se chama offsetof

#include <stdio.h>     
#include <stddef.h>     /* offsetof */

typedef struct{
    char a;
    char b[10];
    char c;
}foo;

int main () {
    foo bar = {'f', "Ola", 'x'};
    unsigned char* pbar = (void*)& bar; // ponteiro a bar
    
    printf ( "offsetof(struct foo,a) is %d\n", ( int ) offsetof ( foo, a ) );
    printf ( "offsetof(struct foo,b) is %d\n", ( int ) offsetof ( foo, b ) );
    printf ( "offsetof(struct foo,c) is %d\n", ( int ) offsetof ( foo, c ) );
    
    printf ( "%s\n", ( char* ) (pbar+offsetof ( foo, b )) ); //pbar+offset do membro b
    
    return 0;
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@MassakiMsk Sim, eu poderia inclusive passar a variável op que estou usando pra "sustentar" o menu. O problema é que pra cada tipo de busca, eu informo um argumento diferente ( string titulo, string autor, int codigo).

 

A única solução que estou vendo é passar a string e o int como opcional:

 

int busca(dLivros l[], string str = "default", int op, int cod = 0); 

//e aí dentro da função eu trato isso...

 

Parece BEM feio e errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp obrigado, pois eu não sabia!

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

@MassakiMsk Sim, eu poderia inclusive passar a variável op que estou usando pra "sustentar" o menu. O problema é que pra cada tipo de busca, eu informo um argumento diferente ( string titulo, string autor, int codigo).

 

A única solução que estou vendo é passar a string e o int como opcional:

 

int busca(dLivros l[], string str = "default", int op, int cod = 0); 

//e aí dentro da função eu trato isso...

 

Parece BEM feio e errado.

Um função de busca que seja global busca byte por byte,

pode ser assim:

/* PARA fórum Clube do Hardware */
/*@authr Mauro Britivaldo */
#include <stdio.h>

//Estrutura de Dados
struct book {
    char snome[50];
    unsigned ucodigo;
};

//Protótipos de Função
int fun_busca_byte(const char* base, const char* obj, const unsigned lim);



/** Função principal que abre o programa */
int main(void)
{
    struct book sclube[2] =
    {   {"Clube do Hardware", 100},
        {"Clube do Hardware", 101}   };

        char snome[] = "Clube do Hardware"; //Dados do tipo char STRING
        printf("Achou? %i\n\n", 
          fun_busca_byte(sclube[0].snome, snome, sizeof snome));

        unsigned ucodigo = 100;//Dados do tipo int INTEIRO
        printf("Achou? %i\n\n", 
          fun_busca_byte((char*)&sclube[0].ucodigo, (char*)&ucodigo, 4));
        return 0;
}

int fun_busca_byte(const char* base, const char* obj, const unsigned lim)
{
    int bytes = 0;
        while( bytes < lim)
        {
            if(*base - *obj) return 0;

            obj++;
            base++;
            bytes++;
        }
        return 1;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×