Ir para conteúdo
Fórum Script Brasil

Castro

Membros
  • Total de itens

    103
  • Registro em

  • Última visita

Posts postados por Castro

  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:

    Queremos um ponteiro do tipo inteiro com um espaço de 5 posições na memória

    int *p;

    p = (int)malloc(5*sizeof(int))

    Lembrete: Um vetor nada mais é que um ponteiro. E uma matriz nada mais é que um ponteiro de ponteiro

    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:
    1 0 131074 524741 4011977
    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:
    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)'
    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 i
    nt *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:

    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 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:

    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 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:
    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 type
    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
    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()': 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'
    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:
    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.
    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. :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. :(

    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. :)

    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..

  18. 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:
    8 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)
    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:
    D:\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)
    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

  19. :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

  20. :)

    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

  21. :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

×
×
  • Criar Novo...