Ir para conteúdo
Fórum Script Brasil
  • 0

Dificuldade no uso de classe derivada


Castro

Pergunta

:(

Vejam o código:

#include <iostream>
using namespace std;

class Circulo
{
  private:
          double Area,raio;
          static const double PI;
          double Area_Circulo();
         
 public:
        Circulo (double r);
        void Mostra_Area();
 };

class Medidas_Circunferencia : public Circulo
{
  private:  
         double Diametro;     
         double Diametro_Circunferencia();   
  public:
         Medidas_Circunferencia(double r):Circulo (r){};
         void Mostra_Medidas_Circunferencia();
                                            
};

Circulo::Circulo(double r)
        :Area(0)
        {
          raio=r;
        }
        

void Circulo::Mostra_Area()
{
     Area_Circulo();
     cout << Area << endl;
     return;
}

double Medidas_Circunferencia::Diametro_Circunferencia()
{
  cout << "Diametro da circunferência:" << endl;                       
  Diametro=2*raio;
  return(Diametro);
}

void Medidas_Circunferência::Mostra_Medidas_Circunferencia()
{
     Diametro_Circunferencia();
     return;
}       

...........
.............

const double Circulo::PI=3.1416; 
              
int main()
{
    Medidas_Circunferencia Medidas(15);
    Medidas.Mostra_Area();
     cout << endl;
        
    return 0;
}
Na linha abaixo estou chamando o construtor da classe-Base Circulo, junto do construtor da derivada, pois sei que construtores não padrão da classe base, tem de ser chamados na derivada.
Medidas_Circunferencia(double r):Circulo (r){};

Sendo o construtor publico, não deveria dar acesso aos membros privados da classe base ? preciso usar PI e raio para calcular diâmetro na derivada.

Construtor a parte, ainda criei uma função publica para chamar a função que calcula o dímetro. Não deveria funcionar pelo menos por causa da função pública ?

Erros:

D:\Teste\heranca.cpp In member function `double Medidas_Circunferencia::Diametro_Circunferencia()'

8 D:\Teste\heranca.cpp `double Circulo::raio' is private

51 D:\Teste\heranca.cpp within this context

8 D:\Teste\heranca.cpp `double Circulo::raio' is private

51 D:\Teste\heranca.cpp within this context

51 D:\Teste\heranca.cpp At global scope:

55 D:\Teste\heranca.cpp stray '\234' in program

55 D:\Teste\heranca.cpp `Medidas_Circunfer' does not name a type

Obrigado

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Falta entender uns conceitos básicos sobre proteção de variáveis:

public: acessível a todos

protected: acessível a classe e a todas as classes derivadas

private: acessível apenas a classe

Ou seja, troque o private por protected e irá funcionar!

Sobre a modelagem das classes, não acho que PI deveria estar dentro do círculo, e sim separado, talvez até como uma constante global.

A classe de medidas da circunferência deveria conter um círculo, e não ser uma derivada deste. Uma medida da circunferência não é um círculo, mas age sobre este. Entretanto, isso é irrelevante se quiser aprender somente a síntaxe, mas caso também esteja querendo aprender POO decentemente e etc., há de se levar estes conceitos em conta.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

:(

Mudei o programa para:

#include <iostream>
using namespace std;

class Circulo
{
  private:
          double Area,raio;
          static const double PI;
          double Area_Circulo();
         
 public:
        Circulo (double r);
        void Mostra_Area();
        double Pega_raio (); // para pegar o valor do raio e
                                  //permitir acesso da classe derivada
 };

class Medidas_Circunferencia : public Circulo
{
  private:  
         double Diametro;     
         double Diametro_Circunferencia();   
  public:
         Medidas_Circunferencia(double r):Circulo (r){};
         void Mostra_Medidas_Circunferencia();
                                            
};

Circulo::Circulo(double r)
        :Area(0)
        {
          raio=r;
        }

double Circulo::Pega_raio ()
{
   return (raio);
}
        
double Circulo::Area_Circulo()
 {
   cout << "Area area do Circulo." << endl;    
   Area=(raio*raio)*PI; // Área do Circulo
   return (Area);
 }

void Circulo::Mostra_Area()
{
     Area_Circulo();
     cout << Area << endl;
     return;
}

double Medidas_Circunferencia::Diametro_Circunferencia()
{
  
  Pega_raio(); //passa
  cout << "Diametro da circunferencia:" << endl;                       
  Diametro=2*raio;
  return(Diametro);
}

void Medidas_Circunferencia::Mostra_Medidas_Circunferencia()
{
     Diametro_Circunferencia();
     return;
}       

const double Circulo::PI=3.1416; //define a variável no
                                 //escopo global
               
int main()
{
    Medidas_Circunferencia Medidas(15);
    Medidas.Mostra_Area();
     cout << endl;
                              
    system ("pause");
    return 0;
}
Se os parâmetros-padrão de uma função membro tem de ser constantes (eu não sabia disso), então fiz:
double Circulo::Pega_raio ()
{
   return (raio);
}

busquei fazer de Pega_raio () apenas uma função de acesso para retornar raio, visando seu uso na derivada. Também tirei o acento colocado indevidamente.

Mesmo assim ocorreram os seguintes erros:

D:\Teste\heranca.cpp In member function `double Medidas_Circunferencia::Diametro_Circunferencia()':

8 D:\Teste\heranca.cpp `double Circulo::raio' is private

60 D:\FonteLivroC++\Capitulo-11\heranca.cpp within this context

8 D:\FonteLivroC++\Capitulo-11\heranca.cpp `double Circulo::raio' is private

60 D:\FonteLivroC++\Capitulo-11\heranca.cpp within this context

Resolvida esta questão, corrigirei a concepção matemática.

Obrigado

Editado por Castro
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...