classes istanciadas vs ponteiros para a classe! [RESOLVIDO]

1. classes istanciadas vs ponteiros para a classe! [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/03/2014 - 20:23h

Pessoal to com uma dúvida!A alguma vantagem de usar ponteiros para uma classe:

class foo
{
public:

myfunction()
{
//Faz alguma coisa!

}

};

int main()
{
foo x;
foo foo_pointer=&x;

foo_pointer->myfuction();




return 0;
}

Ou istancialas diretamente?



class foo
{
public:

myfunction()
{
//Faz alguma coisa!

}

};

int main()
{
foo x;


x.myfuction();




return 0;
}

Alguma vantagem em usar um em vez de outro?Mais desempenho,melhor organização do código?

Para finalizar e aproveitando o tópico já existente:

Qual é o melhor(ou mais recomendado)editor em modo texto para programadores,Vim ou Emacs?
Tenho os dois instalados,mais uso o Emacs.Gostaria de saber as opinões de vocês em relação a isso.





  


2. Re: classes istanciadas vs ponteiros para a classe! [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/03/2014 - 21:08h

Objetos instanciados são como qualquer outra variável dos tipos nativos, então permita-me falar deles como variáveis na discussão abaixo.

Variáveis em C e em C++ têm dois tipos de escopo -- local ou global -- e dois tipos de forma de armazenamento -- automático ou estático.

Escopo global significa que a variável está visível em qualquer parte do programa. Para que isso aconteça, a variável tem de ser declarada no nível mais externo do programa, fora de qualquer definição de função (mesmo main()) ou estrutura. O escopo é dito local quando a variável é declarada dentro de um bloco (seja a definição de uma função, seja o corpo de um if/else ou de um laço de repetição), o que implica que a variável somente será visível dentro daquele bloco, nunca por partes do programa exteriores.

A forma de armazenamento estática significa que o espaço necessário para guardar a variável é fixo e providenciado pelo compilador no momento da compilação. Variáveis globais são sempre estáticas. As locais somente são estáticas se precedidas pela palavra chave static no momento da declaração. Se esse não for o caso, a variável tem armazenamento automático, o que significa que o espaço para armazenar a variável é automaticamente providenciado no momento em que o fluxo de execução do programa passa pelo ponto em que a variável foi declarada e automaticamente liberado ao final do bloco em que a variável está contida.

----

Outra característica fundamental de C e de C++ diz respeito a funções: todos os argumentos de uma função são sempre passados a ela por valor (i.e. a função chamada recebe cópias dos valores informados por quem a chamou). Assim sendo, todas as eventuais alterações que uma função faça sobre os valores recebidos não se refletem sobre os originais.

----

Ponteiros são a ferramenta para que se consiga atravessar as barreiras de escopo e de tempo de vida impostas pelos limites de blocos e pela passagem de argumentos de funções por valor. Se eu obtenho o endereço de uma variável e o passo como argumento a uma função, a cópia desse endereço que é recebida pela função pode ser usada para chegar ao mesmo dado, permitindo que a função o manipule diretamente.

Inversamente, se eu uso uma chamada ao sistema operacional para reservar um bloco de memória compatível com um tipo de dados X e preencho essa região com dados condizentes com uma variável do tipo X, eu poderia devolver um ponteiro para essa região de memória para fora da minha função, com um efeito equivalente a criar novas variáveis do tipo X em tempo de execução. O compilador e o ambiente de execução do C e do C++ não farão a liberação automática dessas variáveis dinamicamente alocadas nem lhes atribui nomes. Cabe ao programador guardar os endereços recebidos enquanto eles forem necessários, pois só por meio desses endereços é que se consegue chegar a cada um dos objetos alocados. Cabe-lhe também e fazer a liberação manual da memória associada aos objetos que não forem mais necessários.


3. Re: classes istanciadas vs ponteiros para a classe! [RESOLVIDO]

Reinaldo de Souza Junior
ReinaldoJr_CPP

(usa Fedora)

Enviado em 14/03/2014 - 14:55h

Thiago unix,

Na verdade a linha 'foo foo_pointer=&x;' deve ser 'foo *foo_pointer=&x;'.

Vamos ver:

"foo x;
foo *foo_pointer=&x;"

Nesse caso a utilizacao de 'foo_pointer' apenas complica as coisas.

'x.myFunction();' e 'foo_pointer->myFunction();' fazem a mesma coisa.

Aproveitando a questao, tenho como regras para desenvolvimento de grandes sistemas em C++:

1) JAMAIS fazer uma atribuição 'foo *foo_pointer=&x;'
Por que?
Em um metodo de 3 ou 4 linhas, blz, mais a medida que o metodo crescer, em métodos complexos, algum programador na hora do apuro pode achar que esta faltando um 'delete foo_pointer;' na medida em que visualmente passe despercebido a atribuicao 'foo *foo_pointer=&x;'. É a dita da linha que voce passa 300x nela, e nao ve o problema. Essa é uma das dificuldades dos ponteiros C++: "porque agora nao está sendo deletado foo_pointer?"


2) Sempre que você usar ponteiros, identifique os que TEM que fazer delete.

TEM que deletar
'foo *foo_pointer=new foo();
...codigo...
delete foo_pointer;'

APENAS ponteiro: o '__ptr__' no nome da variavel indica que nao faz delete nela.
'foo *__ptr__foo=foo_pointer;'


Dessa forma, diminui a chance de 'delete' o que não deve, ou de esquecer de dar um 'delete' no que deve.

Espero ter ajudado.

ReinaldoJr












Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts