Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

matine206

duvidas urgentes c++ d exame

Mensagens Recomendadas

matine206

exponho aqui 2 exercicios d exame diferentes e espero vossa ajuda

Exercicio 1 --Considerando o seguinte codigo, comente a frase " O c++ não assegura completamente o encapsulamento!"

class target_class{

friend class friend_class;

private:

double salary;

int rating;

};

target_class classA;

int main () {

char *p = (char *) &classA;

classA.rating=5;

int *pd = (int*) (p+sizeof(double));

*pd = 5;

return 0;

}

exercicio2 Considerando o seguinte codigo em c++, explique os eventuais problemas de performance existentes, e apresente as respectivas soluções

class Pessoa {

private:

std::string nome;

std::string morada;

public:

Pessoa();

virtual ~Pessoa();

//..

};

class Aluno: public Pessoa {

private:

std::string nomeEscola;

std::string moradaEscola;

public:

Aluno();

~Aluno();

//...

};

int main ( int argc, char** argv) {

//...

bool validaAluno (Aluno s);

Aluno fourrier;

bool fourrierIsOK = validaAluno(fourrier);

//...

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cgoncalves

Conselhos:

1º Usa indentação no código

2º Usa as tags [ code=c++] [ /code] (sem os espaços) de forma a tornar mais perceptível e agradável aos olhos

3º E não menos importante, como deves calcular, ninguém vai resolver os problemas por ti, quais são exactamente as tuas dúvidas nesses dois exercícios?


"Great coders aren't born. They're compiled and released"

"Expert coders do not need a keyboard. They just throw magnets at the RAM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vasco16

porque nao vais por partes.. por exemplo no 1º exercicio.. procuras o que é encapsulamento.. eu ao pesquisar por isso rapidamente obtive uma resposta..

-- www.google.pt

-- pesquisas por. encapsulamento + c++

e entre muitos links encontras isto:

http://pt.wikipedia.org/wiki/C%2B%2B

procuras onde esta a explicar o que é o encapsulamento e tentas relacionar o que lá diz com o que o programa faz..

PS: Aqui o pessoal nao faz trabalhos, tira duvidas e ajuda ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bushin

boas,

Isto tudo para crakear o encapsulamento.

Não consegui entender foi para que servia p?

O seguinte código char* p = (char*) &ClassA;, é um cast, mas vai devolver o que? já fiz o debug mas não consigo entender.

cumprimentos,

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

ClassA ==> objecto de tipo target_class

&ClassA ==> endereço de um objecto de tipo target_class

(char*)&ClassA ==> endereço para valores de tipo char

char* p ==> apontador para valores de tipo char

char* p = (char*)&ClassA; ==> mete p a apontar para o primeiro char do objecto ClassA

Agora é possível ver a representação do objecto ClassA usando caracteres.

(char*)p = (char*)&ClassA;
for (i=0; i<sizeof ClassA; i++, p++) {
  printf("%d: %02x\n", i, *p);
}

Mas o interesse de fazer isto é discutível :P


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Eu diria que serve para provar o que é dito relativamente ao encapsulamento em C++. Passas a conseguir aceder a todos os membros do objecto sem a protecção eventualmente oferecida pela classe.

Possivelmente resultará num warning do compilador.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bushin

Sendo assim

com classA.rating=5; não conseguimos aceder a rating, mas com

char* p = (char*)&ClassA; ==> mete p a apontar para o primeiro char do objecto ClassA

int *pd = (int*) (p+sizeof(double));
*pd = 5; 

estando p a apontar para o primeiro char do objecto classA e dando-lhe, mais espaço do que o que precisa (double), fica com espaço para ser alterado, dado que o espaço protegido é de um int?

cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Não é bem isso.

Ao alocares espaço para um objecto da target_class, ficas com o seguinte espaço alocado:

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

porque (normalmente) o tamanho do double é 8 bytes e o tamanho do int é 4 bytes. Ao fazeres char* p = (char*) &ClassA; ficas com um apontador para byte a apontar para o 1º byte do objecto, ou seja

p

|

V

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

Depois, ao fazeres int *pd = (int*) (p+sizeof(double)); estás a dizer que pd vai ficar a apontar para 8 bytes (porque sizeof(double) = 8 ) à frente de p, ou seja:

p                                  pd = p+8

|                                      |

V p+1  p+2  p+3  p+4  p+5  p+6  p+7  V

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

Como pd é um apontador para int, e no endereço para onde pd aponta foi declarada uma variável do tipo int, podes escrever em (*pd) para afectar o compo rating.

Nota:

| é uma seta a apontar para baixo :P

V


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bushin

boa explicação  :P , quer dizer que no preposito que poderia servir este código (crakear) o programador tinha que "adivinhar" que a variável que ele queria estava a seguir a 8b (double), se no encapsulamento  tivesse mais 8b antes de chegar ao atributo que pretendia-mos daria erro.

Para resolver essa situação teria-mos que acrescentar +sizeof(double), correcto?

int *pd = (int*) (p+sizeof(double)+sizeof(double));
*pd = 5; 

cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

As técnicas de cracking normalmente não seguem esta via, porque alteram directamente o código. Em hacking também não é a mais usual, porque normalmente não se tem acesso ao código fonte e não sabe que está ali uma estrutura ou uma classe. Procura-se por um valor e acede-se directamente ao seu endereço de memória.

A utilidade seria mais ao nível de teres uma biblioteca estática pré-compilada, quereres mudar um valor privado do objecto, mas não quereres seguir os mecanismos de encapsulamento da classe, seja por razões de performance, ou de pura teimosia :P

Se soubesses que tinhas uma classe definida da seguinte forma:

class C {
    int i1, i2;
    double d1, d2;
    char c;
}

C cl;

e por exemplo quisesses obter apontadores para os campos d2 e c, era necessário fazer

char *pcl = (char *)&cl; //este passo não era necessário, bastava utilizar directamente ((char *)(&cl)) onde se vai utilizar pcl, mas fica mais legível desta forma
double *pd2 = (double *)(pcl + /* i1 */ sizeof(int) + /* i2 */ sizeof(int) + /* d1 */ sizeof(double));
char *pc = (char *)(pcl + /* i1 */ sizeof(int) + /* i2 */ sizeof(int) + /* d1 */ sizeof(double) + /* d2 */ sizeof(double));
// ou
// char *pc = (char *)(pd2 + /* d2 */ sizeof(double));


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Isso é uma pergunta?

// comentário de uma linha. Tudo o que estiver à frente das duas barras é um comentário

/* comentário multi-linha.
   é tudo comentário desde o "barra-asterisco"
   até ao "asterisco-barra" */


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.