Pointer this

Iniciado por Diego_Rocha, 20 de Março de 2007, 18:29

tópico anterior - próximo tópico

Diego_Rocha

Alguem poderia me explicar com clareza para que serve o pointer this em c++, sempre vejo ele nos headers e em arquivos de c++ porem não compreendi muito bem o que ele faz e o pior ja cansei de procurar no google e nada se alguem puder me explicar fico grato t++

Darcamo

O pointer this apenas aponta para o objeto atual. Ele pode ser bem útil em muitos casos, mas acho um pouco estranho vc dizer sempre vê ele nos headers.

Exemplo simples de uso:
Tem-se duas classes A e B. A classe B possui um método que recebe como parâmetro um ponteiro para um objeto da classe A. Algo como
void func(A *Aptr)

Se vc instanciar um objeto de cada no main, por exemplo,
A a1;
B b1;
poderia chamar o método de B para atuar no objeto a1 com
b1.func(&a);
Até aí nada de mais.

Mas e se na classe A vc quiser chamar o método de B para atuar no próprio objeto da classe A? Aí vc usa o ponteiro this.

Tipo, vc cria alguma função na classe A e coloca
objeto_classe_b.func(this);
em que objeto_classe_b é um objeto da classe B que vc definiu  na classe A.


Não sei se fui claro. Mas não é difícil entender o funcionamento do ponteiro this.

Diego_Rocha

Darcamo depois de ler algumas vezes eu acho q posso compreender, gostaria se fosse possivel me voce me indicar uma apostila ou um site q fale mais sobre o pointeiro this porque ele tbm é usado assim this->variavel = variavel, gostaria de saber melhor sobre ele porque estou aprendendo qt, e usa muito ele é isso e mais uma vez muito obrigado


Darcamo

Citarthis->variavel = variavel
Coisa estranha de se usar. Mas acho que sei qual é a situação.

Se vc está editando uma função de uma classe e essa classe define uma variável inteira, por exemplo, no header chamada valor, então na função da classe que vc tá editando vc pode colocar algo como
valor = 5;
e essa variável da classe passa a ser igual a 5.

Agora, se nessa função vc resolve criar uma outra variável chamada valor (na minha opinião ta complicando a toa), aí se vc colocar
valor = 10;
a variável que vc criou na função é que receberá 10, e não a variável da classe. Para que a da classe receba 10 vc teria que escrever
this->valor = 10;

Mas isso apenas pq vc resolveu criar uma variável com o mesmo nome de outra definida na classe.

Assim quando ele coloca
this->variavel = variavel;
Ele tá atribuindo a variável valor da classe o que tem na variavel valor definida localmente na função.

Meu conselho é que evite definir variáveis localmente que tenham o mesmo nome de variáveis definidas na classe e esquece o ponteiro this por enquanto.

Diego_Rocha

Realmente tem razão sempre que é usado o this->variavel = variavel, tem duas variaveis declaradas com o mesmo nome,


class Conta {

private:
int numero;
double saldo;

public:
Conta(int numero, double saldo) {
this->numero = numero;
this->saldo = saldo;

}

double getSaldo() {
return this->saldo;
}

};


Muito obrigado pelas explicações, aos poucos vou aprendendo, e agora estou com o livro Programando em c/c++ a biblia, que vai me ajudar bastante, mais uma vez obrigado, estou escrevendo um programinha orientado a objeto, assim q terminar coloco aqui para voces verem se estou no caminho certo t++

Diego_Rocha

#5
grafico.h

#ifndef _GRAFICO_H
#define _GRAFICO_H

#include <iostream>

using namespace std;

class grafico
{
public:
grafico(){};
~grafico(){};
void grafico_positivo(int *x, int *y);
};

#endif


grafico_positivo.h

#include "grafico.h"

void grafico::grafico_positivo(int *x, int *y)
{
int i, j;
int altura = *y + 3;
int largura = *x + 3;
for ( i=altura; i>= 0; --i )
{
if ( i > 9 )
{
if ( i == *y )
{
cout <<"\n"<<*y<<"|";
}
if ( i != *y )
{
cout <<"\n  "<<"|";
}
}
if ( i < 10 )
{
if ( i == *y )
{
cout <<"\n "<<*y<<"|";
}
if ( i != *y )
{
cout <<"\n  "<<"|";
}
}
if ( i == *y  )
{
for ( j=0; j <= ( *x - 1 ); j++ )
{
cout <<"-";
}
}
if ( i < *y )
{
for ( j=0; j <= (*x - 2); j++ )
{
cout <<" ";
}
cout <<"|";
}
if ( i == 0 )
{
cout <<"\r";
cout <<"  0";
for (j=1; j<=largura; j++)
{
cout <<"-";
}
}
}
cout <<endl;
for ( i=0; i<=( *x + 1 ); i++)
{
cout <<" ";
}
cout <<*x<<endl;
}



main.cpp

#include "grafico.h"
#include "grafico_positivo.h"
#include "grafico_negativo.h"

int main()
{
grafico grf;
int _x, _y;
system("clear");
cout <<"\nDigite o valor de y -> ";
cin >> _y;
cout <<"\nDigite o valor de x -> ";
cin >> _x;
if ( _x && _y < 0 )
{
grf.grafico_negativo(&_x, &_y);
}else{
grf.grafico_positivo(&_x, &_y);
}
return 0;
}



o resultado desse programa é esse


Digite o valor de y -> 9

Digite o valor de x -> 7

  |
  |
  |
9|-------
  |      |
  |      |
  |      |
  |      |
  |      |
  |      |
  |      |
  |      |
  0----------
         7


Eu fiz esse programinha so para praticar mesmo, gostaria q voce fala-se algo sobre ele t++

**agora eu fiz uma função para q se o x e y sejam negativos ele tbm constroi o grafico.

grafico_negativo.h

#include "grafico.h"

void grafico::grafico_negativo(int *x, int *y)
{
int i, j;
int altura = *y - 3;
int largura = *x - 2;
cout <<"   "<< *x<< endl<<" ";
for ( i = largura; i<= 0; i++ )
{
cout <<"-";
}
cout <<"0"<<endl;
for ( j = 0; j >= altura; j-- )
{
for ( i = largura; i <=0; i++ )
{
cout <<" ";
if ( i == ( *x + 1) && j >= ( *y + 2))
{
cout <<"|";
}
if ( j == ( *y + 1))
{
for ( i = ( largura - *x ); i <=0; i++)
{
cout <<" ";
}
for ( i = ( *x + 1 ); i <=0; i++)
{
cout <<"-";
}
cout << "|" << *y <<endl;
}
if ( i == 0 )
{
if ( j <= *y )
{
cout <<" |"<<endl;
}else{
cout <<"|"<<endl;
}
}
}
}
}


o resultado é esse



Digite o valor de y -> -8

Digite o valor de x -> -4
   -4
-------0
    |   |
    |   |
    |   |
    |   |
    |   |
    |   |
    |   |
    ----|-8
        |
        |
        |
        |

Darcamo

No caso da classe Conta, ao invés de declarar a função
Conta(int numero, double saldo)

Declara
Conta(int pNumeroInt, double pSaldoDbl)
Assim no corpo da função vc pode colocar apenas
   
  numero = pNumeroInt,
   saldo = pSaldoDbl;


O importante é o nome ser diferente. Assim vc não precisa usar o ponteiro this. Quanto ao prefixo "p" e aos sufixos "Int" e "Dbl" são apenas convenções que eu uso. Vc não precisa usar se não quizer (mas ajuda). O "p" é para indicar que a variável é um parâmetro passado para a função, enquanto que o "Int" e o "Dbl" são apenas para dizer que as variáveis são um inteiro e um double, respectivamente.

Já na função getSaldo, apenas
return saldo;
basta.


Já na classe gráfico, na função
void grafico_positivo(int *x, int *y);
Vc está passando as variáveis x e y como ponteiros para int. Daí precisar usar o operador "*" para deferenciar os ponteiros nas linhas

  int altura = *y + 3;
  int largura = *x + 3;

Vale lembrar que por ter passado um ponteiro como argumento para a função, se vc modificar x ou y dentro da função grafico_positivo o valor delas fora da função será modificado.


Diego_Rocha

Muito obrigado mesmo voce esta me ajudando muito, agora para tornar o codigo mais legivel, usar o this dessa forma atrapalha um pouco ne, declarando variaveis com o mesmo nome, sua dica me acrescentou muito de udar p, Int, Dbl, com certeza isso facilita muito a organização do codigo, mais uma vez obrigado t++