Ir para conteúdo
Fórum Script Brasil

Castro

Membros
  • Total de itens

    103
  • Registro em

  • Última visita

Tudo que Castro postou

  1. :mellow: Fica difícil precisar. Eu estou migrando de linguagem procedural para POO. Eu acredido, que o ideal seja um livro que aborde os conceitos de oo em C++, de forma mais didática possível. Coisa que o livro do SCHILDT, HEBERT C++ Guia para iniciantes, não é sobretudo no tema que estamos discutindo. Se vocês repararem, eu estou sempre fazendo paralelo entre C e C++, para tentar me situar. Por falar nisso, qual a opinião de vocês sobre aquele livro / e-book "Programando em c/c++, a biblia ?" Para não perder o foco, já que estamos falando de paralelo, não sei se fui claro no post 28 tentando exclarecer o post 26, poderiam comenta-lo ? Obrigado
  2. :) Considere a idéia abaixo, e depois analise o post 26 novamente. Eu entendo que quando aloco memória em C, a região de memória é contínua, mas os valores alocados nesta região podem vir de variáveis diferentes, desde que mesmo tipo. Não sendo necessário que seja um vetor Já em C++, eu entendi, que alocar memória para uma quantidade maior de determinado tipo , é a mesma coisa que declarar um vetor dinamicamente. Foi isso que tentei discutir. Quanto aos livros poderia indicar algo intermediário ? realmente Dentel é muito caro, e minha área de atuação não abrange desenho industrial. Quanto aos sites se puder indicar algum em português agradeço. Obrigado
  3. :rolleyes: Você disse: Correto. Lendo sua frase de outra forma: se está alocando um espacço para 5 posições contínuas de memoria para um ponteiro de inteiro, A questão é que olhanho desta forma pode-se visualizar os 5 espaços de memória como sendo ocumados por cinco variáveis inteiras distintas, independente de serem um vetor. Entende a minha confusão agora ? a sintaxe de C permite esta visão. Agora veja o programa abaixo // Alocar array #include <iostream> #include <new> using namespace std; int main() { int *p,i; try { p=new int [10]; // aloque um array de númro inteiro } catch (bad_alloc xa) {// fique atento a uma falha de alocação cout << "Alocação falhou\n"; return 1; } for (i=0; i<10; i++) p[i]=i; for (i=0; i<10; i++) cout << p[i] << " "; delete [] p; /* Limpa a memória alocada pelo array*/ system ("pause"); return 0; Já na sintaxe de C++ eu entendo que p é um vetor com 10 posições alocado dinamicamene, ou seja, tenho uma só variável que aloca um conjunto de dados contínuos. Pelo que entendi, o que faz da linha: p=new int [10]; um vetor é a linha delete [] p; Se eu fizesse: delete p; Então p=new int [10]; Teria a interpretação que dei para sintaxe de C. Espero ter conseguido explicar minha dúvida ou confusão que estou fazendo. Se puder comentar os livros que citei ou indicar algum... Obrigado
  4. :) 20- Foi bom você citar a questão da literatura.. Como disse em poste acima, li o livro “C++ guia para iniciantes” do Hebert Schildt. Mas quando chega em alocação dinâmica e ponteiros, é muito fraco. Eu tentei ler algum material da Internet, mas é muito tosco. Fui ver o livro do Dentel, “programando em C++”, mas apesar de ser considerado bom, achei muito caro. Ouvi falar na “Bíblia do C/C++”, mas não tenho nenhuma referência de crítica sobre ele. Poderiam indicar alguns livros que sejam bons, mas tenham valor intermediários ? 21- É verdade. Minha experiência, é com programação procedural e orientada para eventos. Estou penando com POO. Eu tento criar um paralelo entre as metodologias mas... veja então alguns exemplos: Em sua resposta você disse, a- que a linha: numero *vetor = new Numero[5]; é equivalente a linha int *p; p=(*int) malloc(11* sizeof(int)); Mas quando vejo algo com índice [indice], para mim é um vetor. int *p; não é vetor. Para se ter um vetor de ponteiros, teria de ser, se não me engano: int *p[5]; ou não ? 22- Fazendo um parêntese, em alocação... No programa do post 13, temos a função não membro: float dividir ( float dividendo, float divisor) { return dividendo / divisor; } Se temos as funções membro da classe, que permitem derivação, polimorfismo etc. por que criar uma função não membro ? compatibilidade com C ? 23- No código do post 14, tem-se a seguinte linha: int soma = z->soma(10, 20); mas sei que posso fazer: int soma = z.soma(10, 20); que também dará certo, e mostrará o mesmo resultado. Mas conceitualmente qual a diferença de uma forma e outra ? quando é melhor usar uma ou outra ? Obrigado,
  5. :rolleyes: Ok. 14- Vamos confirmar para ver se entendi corretamente: Se eu quiser alocar um vetor de 5 elementos a partir de um construtor (alocar dinamicamente um construtor com vetor), como você disse: terei que criar um construtor com argumento default. Numero(int num=1){ set(num); } Neste caso todos os elementos do vetor serão 1 que faz concluir que um construtor com vetor deve ser alocado dinamicamente como um ponteiro, como abaixo : Numero *vetor = new Numero[5]; Logo escrever Numero vetor = new Numero[5]; É um erro. 15 – Fiz o seguinte teste, mudei a linha para: Numero *vetor = new Numero; E na saída do programa mostrou valores como: imagino que seja lixo. Minha idéia era fazer Numero vetor = new Numero; E troquei a linha // vetor[i].print(); por: vetor.print(); vetor aqui seria a penas um nome, para alocar um construtor sem vetor, mas deu os erros: 16 – Retornei o programa para o original, e fiz a seguinte mudança no construtor: Numero(const int num=1){ set(num); } Ao definir num como argumento constante, o que estou fazendo de prático ? os resultados são os mesmos.do item 14, ou seja, 1. 17 – Se entendi corretamente ao fazer int *integerPtr = new int(5); Estou alocando memória para um ponteiro de inteiro e inicializando com valor 5. Correto ? 18- Confirmando, sei que nas linhas int *p; p= new int; estou alocando um ponteiro para inteiro, qual é o equivalente da linha int *p; p=(*int) malloc(11* sizeof(int)); onde aloco 11 posições de memória para o tipo inteiro usando new de C++ ? Obrigado
  6. :huh: Realmente você ajudou muito, mas ainda estou "encruado". Então vamos ver o quanto entendi: Minhaclasse *p = new Minhaclasse(); que quando aloco memória para Minhaclasse(); estou alocando memória para a classe como um todo, da mesma forma que faria com um tipo base, entendi corretamente ? Se meu entendimento é correto, em que situação se aloca memória para uma classe ? Quando aloco memória para uns 50 ints sei como utilizar, mas em que situação se joca toda uma casse para heep ? Perguntei sobre alocação de vetores, porque li sobre "templates" (gabaritos), e fiquei com a idéia fixa, de que em C++ o certo em C++ é usar a classe <vector>. Confirmando então, quando faço: int *integerPtr = new int(5); Estou 5 ponteiros para inteiros. Se eu fizer: int integer = new int(5) Estarei alocando 5 inteiros na memória Se eu fizer: int *vetor = new int[5]; Estarei alocando UM vetor de 5 posições que seria o mesmo que: int vetor = new int[5]; Já que tanto em C como C++ vetores é uma outra forma de tratar ponteiros, pelo menos em C se diz que internamente um vetor é um ponteiro. Obrigado
  7. :) 12- Ok. Entendo que um tipo base, seja um tipo de objeto. Logo int seria um objeto. Você disse: Certo. Se na linha: Minhaclasse *z = new Minhaclasse(); Minhaclasse(); não é um construtor, então que tipo de objeto seria ? 13 - Na linha l= new int[5]; entendo, que estou alocando memória para 5 inteiros. Certo ? posso dizer, que esta linha é a versão de C++ para l=(int) malloc(10 * sizeof(int); de C ? Mas e quando se tratar de vetores ? Obrigado
  8. :D OK, 10-Foi dito que: Então volto a questionar, o que é MinhaClasse() após a palavra new, na linha MinhaClasse *classe = new MinhaClasse(); Eu cheguei a pensar que esta linha estivesse alocando memória para um construtor. No livro C++ guia para iniciantes de Hebert Schildt, alocação dinâmica é visto de forma muito breve, ponteiros praticamente não é comentado. Acho até, que o autor para este tema recomenda a leitura de seu livro “C completo e total” o que complicaria um pouco, pois a abordagem é diferente. Visto que não se considera boa prática de programação usar malloc() e free() com C++ 11- Rodei a nova versão do programa e deu certo. Aproveitei e fiz o acréscimo sugerido para usar a função soma(), deu certo #include <iostream> using namespace std; class Minhaclasse { int x,y; public: int soma ( int a, int B); // função membro }; float dividir ( float dividendo, float divisor); // função não membro int main() { Minhaclasse a; Minhaclasse b; Minhaclasse *p = 0; Minhaclasse *z = new Minhaclasse(); int soma = z->soma(10, 20); p= &a; cout << "End class z " << &z << endl; cout << "Ponteiro class z " << z << endl; cout << "Endereco da classe a: " << &a << endl; cout << "Endereco do ponteiro: " << &p << endl; cout << "Ponteiro aponta para : " << p << endl; cout << "Endereco da classe b: " << &b << endl; p = &b; cout << "Endereco aponta para : " << &p << endl; cout << "Soma: " << soma << endl; p=NULL; delete z; z = NULL; cout << "Endereco do ponteiro p : " << p << endl; cout << "Endereco do ponteiro z : " << z << endl; system ("pause"); return 0; } int Minhaclasse::soma(int a , int b) { return a+b; } float dividir ( float dividendo, float divisor) { return dividendo / divisor; } 11-1 Coloquei as linhas p=NULL; z = NULL; após a linha Minhaclasse *z = new Minhaclasse(); e não percebi diferença na saída do programa, por quê apontar para nulo ao final do programa ao invés do início, se o objetivo ao se fazer isto é impedir que o ponteiro aponte para uma área indevida da memória ? se delete libera memória ocupada por z por que fazez z apontar para nulo depois de z não ocupar memória ? 11-2 NULL não é uma macro de C para fazer com que o ponteiro antes de ser inicializado não aponte para regiões indevidas de memória ? C++ não teria um recurso próprio equivalente, sem recorrer a esta macro ? Obrigado
  9. :blush: Adimito que que estou com dificuldade. Vou postar o código, com pequena mudança. #include <iostream> using namespace std; class Minhaclasse { int x,y; public: int soma ( int a, int B); // função membro } float dividir ( float divideno, float divisor); // função não membro int main() { int *p1; float *p2; p1 = new int; p2 = new float; /*Se você quiser retornar o valor, você primeiro aloca um int/float na variável e depois atribui o que é retornado da função ao apontado.*/ p1=new soma(); p2=new dividir(); Minhaclasse m; Minhaclasse *p = new Minhaclasse(); cout << "Tamanho da classe: " << sizeof(m) << endl; cout << "Tamanho do ponteiro: " << sizeof(p) << endl; return 0; } Erros: 8- Se só posso alocar o valor de retorno na função e NÂO a função em si, o que está sendo feito na linha: Minhaclasse *p = new Minhaclasse(); Sei que a variável "p" não foi declarada, dai já um erro, mas como não entendo o que a citada linha faz.. Me parece que se trata de alguma oprtação co construtor. não tenho certeza. 9-por fim não estou entendendo o porquê doos erros apontados. Exemplo: Como "dividir" pode não ter tipo, se eu defini no protótipo ? Obrigado
  10. :( Ok. Realmente continua errado. Fiz a seguinte modificação: #include <iostream> using namespace std; class Minhaclasse { int x,y; public: int soma ( int a, int b); // função membro } float dividir ( float divideno, float divisor); // função não membro int main() { int *p1; float *p2; p1=new soma(); p2=new dividir(); MinhaClasse m; MinhaClasse *p = new MinhaClasse(); cout << "Tamanho da classe: " << sizeof(m) << endl; cout << "Tamanho do ponteiro: " << sizeof(p) << endl; return 0; } Compilei, e deu vários erros. O quê me chamou mais a atenção, foi o fato do erro cair na linha: float dividir ( float divideno, float divisor); // função não membro Escrever está linha, não é a mesma coisa que definir o protótico da função em C ? não deveria funcionar em C++ ? O que está, ainda, errado ? erros Como soma pode estar mau definida, se defini o tipo de retorno e os parâmetros ? Qual deve ser o tipo do ponteiro p para usar na linha MinhaClasse *p = new MinhaClasse(); Obrigado
  11. :blush: Realmente são muitos erros de sintaxe falta de atenção. Vou corrigir o código Minhaclasse { int x,y; public: int soma ( int a, int b); // função membro } float dividir ( float divideno, float divisor); // função não membro int main() { int *p1; float *p2; p1=new soma(); p2=new dividir(); return; } mas vamos por partes, foi dito que: Ok, entendi, que: int soma ( int a, int b); // função membro float dividir ( float divideno, float divisor); // função não membro São apenas definições, assim como os protótipos de C. Para usa-las teria que declara-las como abaixo. Minhaclasse::float dividir ( float divideno, float divisor); // função não membro { corpo.... } fora de main() e da classe. mas a citação não explica sintaticamente como se aloca memória para tipos base de C++, como o atributo ou variável x do código genérico. Esta é a dúvida da letra "c" Outro ponto que não foi discutido, se eu resolver fizer: Minhaclasse *p = new Minhaclasse(); O quê está sendo alocado ? Obrigado
  12. :wacko: Ok. Então vamos por partes, para podermos iniciar uma conversa proveitosa para mim e para outros que leiam este tópico. Antes de eu exclarecer a letra "c", quais os erros em meu código genérico ? Minhaclasse { int x,y, public: int soma ( int a, int b); // função membro } float dividir ( float divideno, float divisor) // função não membro int main() { int *p1, *p2; p=new soma(); p2=new dividir(); return; } Obrigado
  13. :wacko: Considere o código genérico abaixo: Minhaclasse { int x,y, public: int soma ( int a, int b); // função membro } float dividir ( float divideno, float divisor) // função não membro int main() { int *p1, *p2; p=new soma(); p2=new dividir(); return; } 1- Se eu quiser alocar funções individualmente na memória, é possível fazer como acima ? caso seja, qual seria a vantagem ? Pergunto isto, porque exixitem as chamadas funções membro e as não membro. elas são alocadas da mesma forma ? 2- Quando faço Minhaclasse *p = new Minhaclasse(); a-Ao fazer isto, estou alocando dinâmicamente todas as funções da classe, ? b-Minhaclasse() não seria o construtor default ? c- Na classe Minhaclasse, temos variáveis ou atributos, tais como:x, comoalocar variáveis em C++ sem usar as funções malloc() e free de C ? Obrigado
  14. Castro

    Comando return em C++

    :rolleyes: Tudo bem, mas eu queria entender o motivo pelo qual alguns comandos funcinam. A título de exemplo system() e delete. Tenho um código de onde recortei o trecho acima, que funciona deste jeito. delete shapes[5]; vêm após return para liberar o vetor alocado por new. É bom lembrar que estamos falando de C++, printf() é uma função de saida de C. Seja como for, agradeço a atenção. Mas se alguém souber explicar agradeço.
  15. :rolleyes: Fiz: int main() . . . system ("pause"); return 0; delete shapes[5]; } Deu certo. Mas não deveria dar errado, pois coloquei delete depois do último return do programa. Aquele, que retorna um inteiro para o programa principal, indicando que o programa terminou. Quando esse retorno ocorre main() retorna um valor para o SO. Se o programa termina como descrito, como delete pode funcionar ? eu achava que nenhum comando pudesse ser escrito após este último return. Eu tinha convicção de que isto não era possível. Achoentão, que não entendo o papel deste último return, poderiam explicar, inclusive testei com a função system() e deu certo, ou seja, não deu erro. Fato que me deixou espantado. Poderiam explicar. Estou perplexo. Semprer achei que depoi do return nenhum comando funcionasse. Obigado
  16. Castro

    Livros De Estudo Para C

    :( Pessoal não indico meu e-mail, poque sei que vou receber um monte de porcaria extra, mais se alguém tiver o livro "C/C++ como programar, A Biblia" e souber de um link que possa baixa-o, agradeço. Estou procurando na internet, mas os links que acho parecem apontar para outras coisa ou livros. Além disso, parece que este livro tem 400Mb, e só posso fazer dowload com programas tipo dowload Acellerator, já que uso banda estreita. Logo usar programa de e_mail, nem pensar. Obrigado
  17. :D Ok. Dou o tópico como resolvido. Obrigado
  18. Castro

    Livros De Estudo Para C

    :( Alguém sabe informar um link, para baixar o livro “programando em C/C++, A biblia” ? estou procurando na net, mas quando acho o link está inativo ou coisa parecida. preciso muito desse pdf. Obrigado
  19. :) Ok. entendi. Resumindo: se não aloquei memória no construtor, e usar variáveis comumente, então poderei usar o destrutor vazio, caso aloque memória no construtor terei que libera-la no no destrutor. Se vocês não tiverem mais considerações a fazer, darei este tópico como fechado. Obrigado Ps. Tenho alguns outros tópicos se vocês puderem ajudar..
  20. Estou tentando entender sobrecarga de operadores, mas os exemplo que tenho são complicado e ainda tem erros. Vejamos: No livro “C++ guia para iniciantes” do Schild, na página 389, há um programa que tem vários erro de digitação. Eu tentei corrigir, mas não deu muito certo, veja a primeira versão dele Versão 01 #include <iostream> using namespace std; class ThreaD { int x,y,z; //coordenadas 3-D public: ThreaD {x=y=z=0;} ThreaD (int i, int j,int k){x=i;y=j; z=k;} ThreaD operator+ (ThreaD op2); ThreaD operator+ (=ThreaD op2); void show (); }; //sobrecarrege + ThreaD ThreaD:operator+(ThreaD op2) //sobrecarregue + para ThreaD { ThreaD temp; temp.x =x + op2.x; // Há adições de numero inteiro temp.y =y + op2.y; // e o + contém seu original temp.z =z + op2.z; // sguinificado relativo a eles return temp; // Retorne um novo objeto. Deixe os argumentos inalterados } //Sobrecarregue a atribuição ThreaD ThreaD : operator=(ThreaD op2) //Sobrecarregue = para ThreaD { x=op2.x // Há atribuições de numero inteiro y=op2.y //e o = contem seu original z= op2.z // siguinificado relativo a eles return *this; //retorna o objeto modificado } //Mostra as coordenadas X,Y,Z void ThreaD::show() { cout << x << ","; cout << y << ","; cout << z << ","; } int main() { ThreaD a (1,2,3), b(10,10,10),c; cout << "Valores originais"; a.show(); cout << "Valores originais"; b.show(); cout << "\n"; c = a + b + c; // adicione a,b e c juntos cout << "Valor de c apos c = a + b + c \n"; c.show(); cout << "\n"; c=b=a; //demonstra multipla atribuição cout << "Valor de c apos c = b = a: \n"; c.show(); return 0; } Erros: Pessoas tentando me ajudar passaram uma segunda versão que funciona, mas ficou mais complicado, pois criou-se um novo objeto passado por referência além de passar objeto constante ThreaD operator+(const ThreaD & novo_ThreaD); Veja versão 01-a #include<iostream> using namespace std; class ThreaD { int x,y,z; //coordenadas 3-D public: ThreaD (int i, int j, int k); ThreaD operator+(const ThreaD & novo_ThreaD); ThreaD & operator=(const ThreaD & novo_ThreaD); void show (); }; //construtor ThreaD::ThreaD (int i, int j, int k) { x=i; y=j; z=k; } //sobrecarrege + ThreaD ThreaD::operator+(const ThreaD & novo_ThreaD) //sobrecarregue + para ThreaD { ThreaD temp(0,0,0); temp.x = x + novo_ThreaD.x; temp.y = y + novo_ThreaD.y; temp.z = z + novo_ThreaD.z; return temp; } //Sobrecarregue a atribuição ThreaD & ThreaD::operator=(const ThreaD & novo_ThreaD) //Sobrecarregue = para ThreaD { x = novo_ThreaD.x; y = novo_ThreaD.y; z = novo_ThreaD.z; return *this; //retorna o objeto modificado } //Mostra as coordenadas X,Y,Z void ThreaD::show() { cout << x << "," << y << "," << z << endl; } int main() { ThreaD a(1,2,3), b(10,10,10), c(0,0,0); cout << "Valores originais de A: "; a.show(); cout << "Valores originais de B: "; b.show(); cout << endl; cout << "Valor de C apos [ c = a + b + c]\n"; c=c+a+b; c.show(); c=b=a; //demonstra multipla atribuição cout << "Valor de C apos [ c = b = a ]\n"; c.show(); system ("pause"); return 0; } Que funciona, mas que ficou mais complicada Versão 02 Um segundo programa foi tirado da pág. 393 //sobrecarga de operadores unários p 393 #include <iostream> using namespace std; class ThreaD { int x,y,z; //coordenadas 3-D public: ThreaD() {x=y=z=0;} ThreaD (int i, int j,int k){x=i;y=j; z=k;} ThreaD operator++(); //versão de prefixo ++; void show(); }; //sobrecarrege a versão de prefixo ++ ThreaD ThreaD::operator++() //sobrecarregue ++ para ThreaD { x++; // incremente x,y e z y++; z++; return *this; // Retorne o objeto incrementado } // Mostre as coordenadas,x,y,z void ThreaD::show() { cout << x << ","; cout << y << ","; cout << z << "\n"; } int main() { ThreeD a(1,2,3); cout << "valor original de a: "; a.show(); ++a; // incremente a cout << "Valor de ++a: "; a.show(); return 0; } O erro cai na linha ThreeD a(1,2,3); E os erros são: Neste casso, o programa está exatamente como lá. O que está errado ? Uma terceira versão do programa Versão 03 //sobrecarga de operadores função amiga p 399 #include <iostream> using namespace std; class ThreaD { int x,y,z; //coordenadas 3-D public: ThreaD() {x=y=z=0;} ThreaD (int i, int j,int k){x=i;y=j; z=k;} friend ThreaD operator+(ThreaD op1, ThreaD op2); /*Aqui operator+() é amiga de ThreaD observe que dois parâmetros são nescessários */ void show(); }; //O + é agora uma função amiga ThreaD operator+(ThreaD op1, ThreaD op2) { ThreaD temp; temp.x=op1.x + op2.x; temp.y=op1.y + op2.y; temp.z=op1.z + op2.z; return temp; } // Mostre as coordenadas,x,y,z void ThreaD::show() { cout << x << ","; cout << y << ","; cout << z << "\n"; } int main() { ThreeD a (1,2,3), b(10,10,10),c; cout << "valor original de a: "; a.show(); cout << "Original valor de b "; b.show(); cout << "\n"; c=a+b; cout << "valor de c depois c = a + b: "; c.show(); cout << "\n"; c=b=a; cout << "valor de c = b = a: "; c.show(); cout << "valor de b depois c = b = a: "; b.show(); return 0; } O erro cai na linha ThreeD a (1,2,3), b(10,10,10),c; Poderia indicar qual a correção a ser feita na versão 02 e versão 03 ? Está muito complicado entender este tema. Poderiam postar um exemplo “simples” de sobrecarga de operadores + = / etc. ? Obrigado
  21. :rolleyes: Quero fazer um programa, que seja um pequeno cadastro. para isso, gostasria de saber como escrever o destrutor ao fim do programa. No caso do meu post de 12/04, quero saber a forma mais correta de finalizar um veto. Se preciso fercorre o vetor num for para destri-lo, ou basta chamar o construtor vazio para finalizr o vetor ou qualquer outra variável. Entendi, que para alocação de memória isto tem que serexplicitado no destrutor, mas e variáveis de um modo geral ? Obrigado
  22. :D Para deixar a coisa mais clara, qual o procedimento mais correto, escrever pessoa::~pessoa() { for (i=0; i<=10; i++) vet[i]; }; ou pessoa::~pessoa() { }; independente de se usar new e delete para alocar ou liberar memória ? obrigado
  23. :) Ok. Implemntar um destrutor não é redundante, já que quando o programa temina as variáveis são destridas ? exemplo: class pessoa { int vet[10]; public: pessoa(); ~pessoa(); }; pessoa::~pessoa() { cout << "vetor limpo"; }; ou seria melhor fazer isto: pessoa::~pessoa() { for (i=0; i<=10; i++) vet[i]; }; Ps: tenho um tópico "Duvidas sobre construtotres" Obrigado
  24. :mellow: Se entendi bem, só o que tenho que fazer com relação ao destrutor é class nome_classe { ~destrutor(); . . . } nome_classe::destrutor() { vrarriável="valor"; } Nunca fazer int main() { ~destrutor // ERRADO } e chamar o construtor em main(), é correto ? Fiz um programa em que inicializei as variáveis nos contrutores, mas pude usar as variáveis sem chamar o contrutor em main() Obrigado
  25. :) Cero, exatamente como fiz para copiar, e depois é só destruir (aplicar destrutor) a copia. vou testar
×
×
  • Criar Novo...