Castro
-
Total de itens
103 -
Registro em
-
Última visita
Posts postados por Castro
-
-
:)
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:
Queremos um ponteiro do tipo inteiro com um espaço de 5 posições na memóriaint *p;
p = (int)malloc(5*sizeof(int))
Lembrete: Um vetor nada mais é que um ponteiro. E uma matriz nada mais é que um ponteiro de ponteiroCorreto. 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 linhadelete [] p;
Se eu fizesse:delete p;
Entãop=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 linhaint *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 escreverNumero 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 fazer1 0 131074 524741 4011977Numero 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:C:\Documents and Settings\joubert\Meus documentos\teste.cpp In function `int main()': 17 C:\Documents and Settings\joubert\Meus documentos\teste.cpp invalid conversion from `Numero*' to `int' 17 C:\Documents and Settings\joubert\Meus documentos\teste.cpp initializing argument 1 of `Numero::Numero(int)'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 fazerint *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 linhaint *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:
Alocar memória é SEMPRE para um objeto e não para um construtor. O próprio Stroustrup (criador do C++) diz que, para C++, é melhor utilizar new em vez de malloc().Certo. Se na linha:
Minhaclasse *z = new Minhaclasse();
Minhaclasse(); não é um construtor, então que tipo de objeto seria ? 13 - Na linhal= new int[5];
entendo, que estou alocando memória para 5 inteiros. Certo ? posso dizer, que esta linha é a versão de C++ paral=(int) malloc(10 * sizeof(int);
de C ?
Mas e quando se tratar de vetores ?
Obrigado
-
:D
OK,
10-Foi dito que:
Você não pode fazer isto:p1=new soma();
p2=new dividir();
E por quê? Porque soma e dividir não são tipos, mas funções.
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 linhasp=NULL; z = NULL;
após a linhaMinhaclasse *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:12 D:\Sobre_C++\TestC++\alocando-func.cpp new types may not be defined in a return type 12 D:\Sobre_C++\TestC++\alocando-func.cpp two or more data types in declaration of `dividir' D:\Sobre_C++\TestC++\alocando-func.cpp In function `int main()': 25 D:\Sobre_C++\TestC++\alocando-func.cpp `soma' has not been declared 26 D:\Sobre_C++\TestC++\alocando-func.cpp `dividir' is not a typeMinhaclasse *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 linha12 D:\Sobre_C++\TestC++\alocando-func.cpp new types may not be defined in a return type 12 D:\Sobre_C++\TestC++\alocando-func.cpp two or more data types in declaration of `dividir' D:\Sobre_C++\TestC++\alocando-func.cpp In function `int main()': 21 D:\Sobre_C++\TestC++\alocando-func.cpp `soma' has not been declared 22 D:\Sobre_C++\TestC++\alocando-func.cpp `dividir' is not a type 24 D:\Sobre_C++\TestC++\alocando-func.cpp `MinhaClasse' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 24 D:\Sobre_C++\TestC++\alocando-func.cpp expected `;' before "m" 25 D:\Sobre_C++\TestC++\alocando-func.cpp `p' undeclared (first use this function) 25 D:\Sobre_C++\TestC++\alocando-func.cpp `MinhaClasse' has not been declared 27 D:\Sobre_C++\TestC++\alocando-func.cpp `m' undeclared (first use this function) 30 D:\Sobre_C++\TestC++\alocando-func.cpp return-statement with no value, in function returning 'int'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:O que você chama de funções "membro" e "não-membro" são alocadas da mesma forma na memória. Suas variáveis são alocadas na Stack, ou seja, só quando a função for chamada é que ela será alocada na memória.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çoMinhaclasse *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 constante8 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected unqualified-id before '{' token 12 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp declaration of `operator+' as non-function 12 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected `;' before '(' token 18 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp invalid function declaration 32 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp invalid function declaration D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp In function `int main()': 54 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp no matching function for call to `ThreaD::ThreaD()' note D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp:5 candidates are: ThreaD::ThreaD(const ThreaD&) note D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp:5 ThreaD::ThreaD(int, int, int)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 linhaThreeD 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 03D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp In function `int main()': 36 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp `ThreeD' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 36 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected `;' before "a" 38 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp `a' undeclared (first use this function)//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 linhaThreeD 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]; };
oupessoa::~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 fazerint 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
Alocação dinâmica de funçôes em C++
em C, C++
Postado · Editado por Castro
: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