
Castro
Membros-
Total de itens
103 -
Registro em
-
Última visita
Tudo que Castro postou
-
: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
-
:) 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
-
: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
-
:) 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,
-
: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
-
: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
-
:) 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
-
: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
-
: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
-
:( 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
-
: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
-
: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
-
: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
-
: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.
-
: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
-
:( 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
-
:D Ok. Dou o tópico como resolvido. Obrigado
-
:( 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
-
:) 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..
-
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
-
: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
-
: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
-
:) 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
-
: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
-
:) Cero, exatamente como fiz para copiar, e depois é só destruir (aplicar destrutor) a copia. vou testar