matine206 0 Denunciar mensagem Publicado 7 de Fevereiro de 2009 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 0 Denunciar mensagem Publicado 7 de Fevereiro de 2009 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
matine206 0 Denunciar mensagem Publicado 9 de Fevereiro de 2009 ok... so ke me ajudassem a identificar os eventuais nos codgigos ja seria bom para mim Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
vasco16 0 Denunciar mensagem Publicado 9 de Fevereiro de 2009 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 0 Denunciar mensagem Publicado 10 de Fevereiro de 2009 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
matine206 0 Denunciar mensagem Publicado 11 de Fevereiro de 2009 poix sinceramente tb nao sei o k faz Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 11 de Fevereiro de 2009 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 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 0 Denunciar mensagem Publicado 12 de Fevereiro de 2009 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 0 Denunciar mensagem Publicado 13 de Fevereiro de 2009 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 0 Denunciar mensagem Publicado 13 de Fevereiro de 2009 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 V Desaparecido. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
bushin 0 Denunciar mensagem Publicado 13 de Fevereiro de 2009 boa explicação , 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 0 Denunciar mensagem Publicado 13 de Fevereiro de 2009 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 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
bushin 0 Denunciar mensagem Publicado 13 de Fevereiro de 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
jack_de 0 Denunciar mensagem Publicado 18 de Fevereiro de 2009 como comentar um programa em c++ Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
TheDark 0 Denunciar mensagem Publicado 18 de Fevereiro de 2009 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