Ir ao conteúdo
  • Cadastre-se
VirtualDarckness

C++ orientação a objeto c++

Recommended Posts

Galera estou aprendente pelo o livro "treinamento em linguagem c++" e não estou entendendo esse código no livro estou copiando do mesmo jeito mas esta tando esses erros, alguém pode me explicar o que esta errado ?

 

estou usando o Visual Studio.

deste de já agradeço.

class Data
{
public:
    int dia, mes, ano;

private:
    int Bissexto( )      //fuçao inline
    {
        return (ano % 4 == 0 && ano % 100 || ano % 400 == 0);
    }

    void InitData(int d, int m, int a) //inicializaçao de dados
    {
        void PrintData();
        void PrintSigno();
        void PrintBissexto();
    };
    void Data::InitData(int d, int m, int a)                          //o nome qualificado não e permitido a em declaração de membro << esta tanto esse erro nesse lugares 
    {
        int dmes[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        ano = a > 0 ? a : 1;//valida ano
        dmes[2] = dmes[2] + Bissexto();
        mes = m >= 1 && m <= 12 ? m : 1; //valida mes
        dia = d >= 1 && d <= dmes[mes] ? d : 1;//valida dia
    }
    void Data::PrintData()                                              //o nome qualificado não e permitido a em declaração de membro
    {
        char nome[13][10] =
        { "zero","janeiro","fevereiro","março","abriu",
            "maio","junho","julho","agosto","setembro",
            "outubro","novembro","dezembro"
        };
        cout << dia << "de" << nome[mes] << "de" << ano << endl;
    }

    void Data::PrintSigno()                          //o nome qualificado não e permitido a em declaração de membro
    {
        char nsigno[14][12] =
        {
            "zero","capricornio","aquario","peixes","aries",
            "touro","gemeos","leao","virgem",
            "libra","escorpiao","sagitario","capricornio"
        };
        int sig[] = { 0,20,19,20,20,20,20,21,22,22,22,21,21 };        if (dia < sig[mes])
            cout << "Signo: " << nsigno[mes] << endl;
        else
            cout << "signo: " << nsigno[mes + 1] << endl;
    }
     Data::PrintBissexto()                            //o nome qualificado não e permitido a em declaração de membro
    {
        if (Bissexto())
            cout << "ano e bissexto." << endl;
        else
            cout << "ano nao e bissexto." << endl;
    }
    
};

int main()                                                                                         
     {
         Data x, y, z;
         x.InitData(14, 6, 1992);   // aqui esta falando que a função esta inacessível << em todos elas 
         y.InitData(12, 1, 1976);
         z.InitData(30, 7, 1978);



         x.PrintData();
         x.PrintData();

         x.PrintBissexto();



         y.PrintData();
         y.PrintData();
         y.PrintBissexto();



         z.PrintData();
         z.PrintData();
         z.PrintBissexto();
     }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@VirtualDarckness Olá. É o seguinte amigo. Do modo como está sua classe Data você deixou os métodos dessa classe como privados. Devem ser públicos. Os atributos q devem ficar como privados, pela questão do encapsulamento

Basicamente seu código ficaria assim (eu teria q analisar melhor o código, mas postando assim você já vai se localizar):

 

Arquivo Data.hpp

#pragma once

class Data
{
public:
    Data(int d, int m, int a); // construtor parametrizável
    Data(); // construtor padrão
    // métodos da classe
    int Bissexto();
    void InitData(int d, int m, int a); //inicializaçao de dados
    void PrintData();
    void PrintSigno();
    void PrintBissexto();

// atributos
private:
    int dia, mes, ano;
};

Arquivo Data.cpp:

#include <iostream>
using namespace std;

#include "Data.hpp"

Data::Data()
{
	
}

// construtor paramatrizável (o contrutor só é chamado ao criar um novo objeto com o operador new
Data::Data(int d, int m, int a) {
    this->dia = d;
    this->mes = mes;
    this->ano = ano;
    // aqui não entendi por que chamar esses métodos no contrutor
    PrintData();
    PrintSigno();
    PrintBissexto();
}

int Data::Bissexto( )      //fuçao inline
{
    return (ano % 4 == 0 && ano % 100 || ano % 400 == 0);
}


void Data::InitData(int d, int m, int a)                          //o nome qualificado não e permitido a em declaração de membro << esta tanto esse erro nesse lugares
{
    int dmes[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    ano = a > 0 ? a : 1;//valida ano
    dmes[2] = dmes[2] + Bissexto();
    mes = m >= 1 && m <= 12 ? m : 1; //valida mes
    dia = d >= 1 && d <= dmes[mes] ? d : 1;//valida dia
}
void Data::PrintData()                                              //o nome qualificado não e permitido a em declaração de membro
{
    char nome[13][10] =
    {   "zero","janeiro","fevereiro","março","abriu",
        "maio","junho","julho","agosto","setembro",
        "outubro","novembro","dezembro"
    };
    cout << dia << " de " << nome[mes] << " de " << ano << " " << endl;
}

void Data::PrintSigno()                          //o nome qualificado não e permitido a em declaração de membro
{
    char nsigno[14][12] =
    {
        "zero","capricornio","aquario","peixes","aries",
        "touro","gemeos","leao","virgem",
        "libra","escorpiao","sagitario","capricornio"
    };
    int sig[] = { 0,20,19,20,20,20,20,21,22,22,22,21,21 };
    if (dia < sig[mes])
        cout << "Signo: " << nsigno[mes] << endl;
    else
        cout << "signo: " << nsigno[mes + 1] << endl;
}
void Data::PrintBissexto()                            //o nome qualificado não e permitido a em declaração de membro
{
    if (Bissexto())
        cout << "ano e bissexto." << endl;
    else
        cout << "ano nao e bissexto." << endl;
}

Arquivo com o método Main. Pode ser Data_main.cpp

#include "Data.hpp"
#include "Data.cpp"

int main()
{
    Data x, y, z;
    x.InitData(14, 6, 1992);   
    y.InitData(12, 1, 1976);
    z.InitData(30, 7, 1978);

    x.PrintData();    
    x.PrintBissexto();
    x.PrintSigno();    

    y.PrintData();    
    y.PrintBissexto();
    y.PrintSigno();

    z.PrintData();    
    z.PrintBissexto();
    z.PrintSigno();
}

Aqui tá rodando. Criei os três arquivo e tudo ok. Experimenta aí para ver se vai, ok?

adicionado 18 minutos depois

Se quiser criar um novo objeto da classe Data seria isso: (perceba q está dando erro, por isso chame os métodos aqui):

Data *data = new Data(24, 3, 2011); // aqui os métodos do contrutor são chamados, mas tá dando erro no resultado
    
delete data; // libera o objeto da memória

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
20 horas atrás, giu_d disse:

ano = a > 0 ? a : 1;//valida ano

O ano Zero "existe" é normatizado (Wikipedia ISO 8601:2004), e considerado bissexto.

 

 

20 horas atrás, giu_d disse:

Aqui tá rodando.

Depois que @giu_d concertou, bastou alguns ajustes, fiz também alguns adaptações para favorecer ainda mais o style C++ e suas ferramentas, a função de signos retornou valor errado para meu signo então não sei rescrevi a tabela de signos e funcionou:

void Data::prnt_signo (){
  vector<char> dia_signo{0, 20, 18, 20, 20, 20, 20, 22, 22, 22, 22, 21, 21};
  vector<string> nsigno{"Capricornio",
                        //  ^~~~~~~
                        //  Fix:Bug para Janeiro <= 20
                        //
    "Aquario",    "Peixes", "    Aries",       "Touro",
     "Gemeos",    "Cancer",      "Leao",      "Virgem",
      "Libra", "Escorpiao", "Sagitario", "Capricornio"};
  //  ^~~~~~
  //  Tabela de correspondência Signo -> Data pego no Site AstroCentro
  //  Local: www.astrocentro.com.br/blog/astrologia/datas-cada-signo/
  //  Acessado em: 27 / 7 / 2018
  //
    if (dia_  <=  dia_signo.at (mes_)){
        cout << "Signo: " << nsigno.at (mes_ - 1) << endl;}
    else {
        cout << "Signo: " << nsigno.at (mes_) << endl;}
  return;}

Dúvidas?

 

adicionado 32 minutos depois

Atualizado: Fix-Problema quando mês é Janeiro e o Dia é <= 20.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×