[ +/- ] [ Data/Hora: 20 Mai 2013, 11:39 ]


Criar um novo TópicoWrite comments Página 1 de 1   [ 8 posts ]
Autor Mensagem
 Assunto da Mensagem: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 01 Ago 2011, 17:20 
Membro Júnior

Registado: 20 Dez 2010, 02:41
Mensagens: 69
Vamos supor que eu tenha o seguinte trecho de código:
Code:
//Criando uma estrutura e instanciando um objeto.
struct TESTE
{
  int   inteiro;
  float flutuante;
  char  *string;
} estrutura;

//Declarando ponteiros pra elementos de estruturas e inicializando-os com os endereços desses elementos
int    TESTE::*a = &TESTE::inteiro;
float  TESTE::*b = &TESTE::flutuante;
char * TESTE::*c = &TESTE::string;

//Atribuindo valores através desses ponteiros
estrutura.*a = 123;
estrutura.*b = 3.1415;
estrutura.*c = "Isso é um teste!";

//Imprimindo valores acessando os elementos diretamente
printf ("%d\n%f\n%s", estrutura.inteiro, estrutura.flutuante, estrutura.string);

Na parte em que é atribuído valores para os elementos eu poderia muito bem fazer da seguinte forma:
Code:
estrutura.inteiro =   123;
estrutura.flutuante = 3.1415;
estrutura.string =    "Isso é um teste!";

Ou seja, acessando os elementos diretamente. Acredito que assim seja até mais eficiente, pois não é necessário fazer nenhuma desreferência.

Sendo assim, qual é o propósito de existir ponteiros pra elementos de estrutura se podemos acessar os elementos diretamente.

Acredito que esse exemplo que eu usei seja bem básico e por isso não reflita alguma condição onde os ponteiros pra elementos de estrutura sejam realmente úteis. No entanto, eu gostaria de saber.

Existe alguma situação diferente em que eles podem fazer coisas que o acesso direto não pode?


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 10:39 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
Confesso que não pude entender sequer como seu programa pôde ser compilado... O que voc? quis fazer não é algo como abaixo?

Code:
#include <stdio.h>

//Criando uma estrutura e instanciando um objeto.
struct TESTE
{
  int   inteiro;
  float flutuante;
  char  *string;
} estrutura;

int main(void)
{
  //Declarando ponteiros pra elementos de estruturas e inicializando-os com os endereços d
  int    *a = &estrutura.inteiro;
  float  *b = &estrutura.flutuante;
  char  **c = &estrutura.string;

  //Atribuindo valores através desses ponteiros
  *a = 123;
  *b = 3.1415;
  *c = "Isso é um teste!";

  //Imprimindo valores acessando os elementos diretamente
  printf ("%d\n%f\n%s\n", estrutura.inteiro, estrutura.flutuante, estrutura.string);
}


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 16:06 
Membro Júnior

Registado: 20 Dez 2010, 02:41
Mensagens: 69
Fpissara.

Você me mostrou aquilo que seria a minha intenção de fazer, mas na verdade não é nada disso. O que eu queria mostrar aqui no fórum é exatamente aquilo que eu fiz mesmo.

Se o que eu mostrei é uma estrutura de codificação válida da linguagem, significa que ela tem alguma utilidade em algum momento. Por isso perguntei aqui no fórum pra saber se alguém conhece alguma utilidade nesses ponteiros pra elementos de estrutura, se é que tem.

Caso queira saber mais sobre isso que eu mostrei, é só procurar no Google com os termos "ponteiros para elementos de classe". Na minha pergunta eu coloquei 'ponteiro para elemento de estrutura' em vez de 'ponteiro para elemento de classe' só porque eu sempre uso estrutura ao invés de classe, já que com estrutura é possível fazer TUDO o que se faz com classe. Talvez isso tenha confundido um pouco as coisas.

Eu procurei no Google qual seria a utilidade dessa estrutura de programação e não consegui descobrir ainda.


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 16:33 
Membro Avançado
Avatar do Utilizador

Registado: 26 Jun 2008, 21:26
Mensagens: 673
Localização: Brasil
Só um ponto, rickforce: A classe tem algumas funcionalidades a mais do que estruturas sim, muitas coisas disponíveis na classe não podem ser feitas com estruturas, como elementos protegidos, públicos, declaração nos argumentos da função, mais dinâmica, flexibilidade, além da famosa "Classes podem ser estruturas de funções"! :) Mas eu também uso mais estruturas, classes mais para coisas específicas, como por exemplo, uma classe de Vetor3D, que fica muito difícil de fazer com estrutura!

Quanto ao seu código, não sei te responder, nem posso dizer que esteja errado, só digo que nunca vi esse tipo de atribuição! Mas deve ter relação com o uso dinâmico do ponteiro depois, se houver uso dinâmico! Senão, não vejo para que fazer isso!

Desculpa o falatório, kkkk :)

T+

_________________
"Uma pequena pedra...Pode provocar uma avalanche..."

Para quem quiser baixar meu jogo:
http://www.megaupload.com/?d=EHPAYBVQ

Se quiser discutir e votar sobre o jogo:
http://www.unidev.com.br/phpbb3/viewtopic.php?f=5&t=53423


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 18:04 
Membro Júnior

Registado: 20 Dez 2010, 02:41
Mensagens: 69
Ferat.

Se com elementos protegidos e públicos você tiver se referindo ao uso das palavras-chaves public, private e protected que costumam ser usadas em classes, estas podem ser usadas em estruturas também:
Code:
struct TEST
{
  private:
    int num1;
  protected:
    int num2;
  public:
    int num3;
} estrutura;
estrutura.num1= 123; //Erro! Elemento é private!
estrutura.num2= 123; //Erro! Elemento é protected!
estrutura.num3= 123; //OK! Elemento é public!


Estruturas também permitem construtores e destrutores:
Code:
struct TEST
{
  int *num1;
  TEST ()
  {
    num1= new int (123);
  }
  ~TEST ()
  {
    delete num1;
  }
} estrutura;

Permitem herança:
Code:
struct BASE
{
  int num1;
};

struct DERIVADA: BASE
{
  int num2;
};

DERIVADA test;
test.num1= 123;
test.num2= 123;

Permitem também declarações internas de funções, sobrecarga de operadores, templates, funções virtuais, entre outras coisas, tal como classes.

A única coisa que eu conheço que estrutura tem de diferente de classe é que enquanto você não colocar nenhum identificador de nível de acesso (public, private ou protected), na estrutura o default é public, enquanto que nas classes são private.

Um dia eu tive essa discussão (amigável) com colegas de classe. Eu dizia que estruturas que você cria fazem exatamente TUDO que classes fazem em C++, com exceção, claro, do nível de acesso default, que difere de uma pra outra. Depois de muito insistir que dava pra fazer TUDO, eu mostrei na prática. Depois disso, imperou um silêncio constrangedor na sala, dava até pra ouvir um alfinete cair no chão. Nem o professor me contrariou.

Juro que fiquei com um pouco de medo de alguém me mostrar algo que dava pra fazer com classe que não dava pra fazer com estrutura, pois estava defendendo a minha opinião com unhas e dentes. Poderia ter queimado a língua.

Se você conhecer alguma coisa que dá pra fazer com classe que não dá pra fazer com estrutura, por favor, me mostre com um pequeno exemplo. Se eu tiver errado, quero saber o quanto antes. Não quero continuar acreditando numa coisa que não é verdade, se for o caso. Isso pode ficar feio pra mim se eu tiver outra dessa discussão e a pessoa me mostrar que eu tô errado, né? Imagina só. :)


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 20:17 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
rickforce Escreveu:
Você me mostrou aquilo que seria a minha intenção de fazer, mas na verdade não é nada disso. O que eu queria mostrar aqui no fórum é exatamente aquilo que eu fiz mesmo.

Se o que eu mostrei é uma estrutura de codificação válida da linguagem, significa que ela tem alguma utilidade em algum momento. Por isso perguntei aqui no fórum pra saber se alguém conhece alguma utilidade nesses ponteiros pra elementos de estrutura, se é que tem.


Só que o fragmento de código que você postou não compila porque não existem membros *a, *b e *c na estrutura da classe... E, ainda, &TESTE::inteiro, por exemplo, não poderia ser obtido, já que o membro inteiro não existe fora do contexto de um objeto.

Além disso, como já disseram por aqui, tem coisas que ficam mais complicadas de fazer com estruturas simples... Se você estiver falando da palavra-chave struct, em C++, então uma "estrutura" é essencialmente a mesma coisa que uma classe, exceto que seus membros são públicos por default... Mas uma estrutura "primitiva" é diferente de classes porque não implementa os pilares da orientação à objetos: encapsulamento (nada de private e protected), polimorfismo (nada de sobrecarga ou funções virtuais) e herança... Nem mesmos contrutores e destrutor.


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 21:45 
Membro Júnior

Registado: 20 Dez 2010, 02:41
Mensagens: 69
Fpissara, meu código não compilou na sua máquina?! Sério?! Eu acabei de fazer um ctrl + c, ctrl + v aqui pra conferir se eu tinha escrito algo errado, mas não. Deu tudo certo aqui. Compilou e funcionou direitinho. Nem warning deu.

No exemplo que eu escrevi, *a, *b, *c não são elementos da estrutura. São ponteiros pra elemento de estrutura mesmo. Elementos externos e que nem mesmo precisam receber um valor pra existir.

Talvez o fato de eu já criar esses ponteiros e inicializá-los ao mesmo tempo tenha feito o código ficar menos legível. Eu poderia muito bem fazer assim:
Code:
//Declarando ponteiros pra elementos de estruturas
int    TESTE::*a;
float  TESTE::*b;
char * TESTE::*c;

//Atribuindo os endereços dos elementos de estrutura para os ponteiros
a = &TESTE::inteiro;
b = &TESTE::flutuante;
c = &TESTE::string;


Se você imprimir o valor desses ponteiros como se fossem variáveis do tipo int, você teria o seguinte resultado:
Code:
printf ("a= %d, b= %d, c= %d", a, b, c);
//Resultado na tela: a= 0, b= 4, c= 8

Faz bastante sentido, já que esses valores seriam os deslocamentos a partir do endereço do objeto da estrutura pra chegar até o endereço do elemento da estrutura. Quando eu mostrei isso pro meu professor, que já leciona há 30 anos, ele ficou me olhando com uma cara estranha por uma meia hora, me disse que eu era extraterrestre!!! :lol: :lol: :lol:

Mudando de assunto, também gostaria de entender o que você quis dizer com estrutura "primitiva". Não sei se eu entendi direito.

O que eu supos que seja, é a struct implementada na linguagem C pura, ou seja, sem suporte a todas as funcionalidades da linguagem orientada a objeto. Caso fosse isso, entenderia, pois poderia causar problemas de incompatibilidade. Nesse caso faria bastante sentido. Na verdade, eu nunca mexi com C puro, então eu nem sei se as funcionalidades da programação orientada a objetos funcionaria nele (imagino que não).

Outra coisa que eu supos, foi as estruturas anônimas. Nesse caso, algumas das coisas que funcionam numa estrutura com nome funcionam nele também, como as palavras-chave public, private e protected, e as funções internas. Não deu pra fazer construtores e nem destrutores justamente pela falta de nome pro tipo de dado que você cria, já que construtores e destrutores recebem o mesmo nome da estrutura. Também não funciona herança e template também pela falta de nome pro tipo criado. Algumas sobrecargas de operadores funcionaram, outras não. E tudo o que não pode, sempre esbarra na mesma limitação: falta de nome pra estrutura. Tudo aquilo que não depende de um nome pra estrutura funciona:
Code:
struct
{
  int num[4];
  operator int ()
  {
    return num[0]+num[1]+num[2]+num[3];
  }
} estrutura;
estrutura.num[0]= 1;
estrutura.num[1]= 2;
estrutura.num[2]= 3;
estrutura.num[3]= 4;

int soma= estrutura;
printf ("soma= %d", soma);
//sobrecarga do operador int retorna a soma de todos os elementos da estrutura pra variável inteira.
//soma= 10


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Ponteiro pra elemento de estrutura. Pra que serve isso?
MensagemEnviado: 03 Ago 2011, 22:49 
Membro Ativo

Registado: 02 Jun 2011, 22:24
Mensagens: 167
rickforce Escreveu:
Fpissara, meu código não compilou na sua máquina?! Sério?! Eu acabei de fazer um ctrl + c, ctrl + v aqui pra conferir se eu tinha escrito algo errado, mas não. Deu tudo certo aqui. Compilou e funcionou direitinho. Nem warning deu.


Credo!! E não é que o treco funciona mesmo!?
Mas que é MUITO estranho, é!

Quote:
Faz bastante sentido, já que esses valores seriam os deslocamentos a partir do endereço do objeto da estrutura pra chegar até o endereço do elemento da estrutura. Quando eu mostrei isso pro meu professor, que já leciona há 30 anos, ele ficou me olhando com uma cara estranha por uma meia hora, me disse que eu era extraterrestre!!! :lol: :lol: :lol:


Concordo que a sintaxe:

Code:
type classname::*pointer;


Até que faz sentido, mas, pra mim, usar:

Code:
objectname.*pointer


É meio esquisito...

Quote:
Mudando de assunto, também gostaria de entender o que você quis dizer com estrutura "primitiva". Não sei se eu entendi direito.

O que eu supos que seja, é a struct implementada na linguagem C pura, ou seja, sem suporte a todas as funcionalidades da linguagem orientada a objeto. Caso fosse isso, entenderia, pois poderia causar problemas de incompatibilidade. Nesse caso faria bastante sentido. Na verdade, eu nunca mexi com C puro, então eu nem sei se as funcionalidades da programação orientada a objetos funcionaria nele (imagino que não).


É isso o que eu quis dizer com "primitiva"... ;)


Topo
 Perfil  
 
Mostrar mensagens anteriores:  Ordenar por  
Criar um novo TópicoWrite comments Página 1 de 1   [ 8 posts ]
Similar topics
Isso é classico!
Fórum: OFF-Topic
Autor: savior
Respostas: 7
Encriptacao: Quero ver quem resolve isso.
Fórum: C/C++
Autor: Malebolgia
Respostas: 5
/f e /v.. pra q serve?
Fórum: C/C++
Autor: lucasteixeira
Respostas: 1
make, makefile, install, CMake, que isso?! :o
Fórum: Assuntos diversos
Autor: Stauricus
Respostas: 4
O que deve ser isso
Fórum: Blitz Basic
Autor: Eric Draven
Respostas: 4
Topo


Quem está ligado:

Utilizador a ver este Fórum: Google [Bot] e 1 visitante


Criar Tópicos: Proibído
Responder Tópicos: Proibído
Editar Mensagens: Proibído
Apagar Mensagens: Proibído

Pesquisar por:
Ir para:  

cron


Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840