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

não consigo compilar um construtor


willsonny

Pergunta

Não consigo compilar o construtor da classe Livro, por que? ,se eu tiro o construtor o programa roda blz, alguém me da uma luz?

	#include <iostream>
#include <string>
using namespace std;
	class Pessoa{
    public:
        Pessoa(string n, int i,string s){
            setNome(n);
            setIdade(i);
            setSexo(s);
        }
        void FazerNiver(){
            setIdade(getIdade()+1);
        }
        void setIdade(int i){
            idade=i;
        }
        void setNome(string n){
            nome=n;
        }
        void setSexo(string s){
            sexo=s;
        }
        int getIdade(){
            return idade;
        }
        string getNome(){
            return nome;
        }
        string getSexo(){
            return sexo;
        }
    private:
        string nome, sexo;
        int idade;
};
	class Livro:public Pessoa{
private:
        string nome, autor;
        int totalPag, pagAtual;
        bool aberto;
        Pessoa leitor;
public:
        Livro(string n,int t,string a,Pessoa l){
            totalPag=t;
            nome=n;
            autor=a;
            leitor=l;
        }
        void Detalhe(){
	        }
        void Abrir(){
            setAberto(true);
        }
        void Fechar(){
            setAberto(false);
        }
        void Folhear(int p){
            if(p>getTotalPag()){
                setPagAtual(0);
            }else{
                setPagAtual(p);
            }
        }
        void Avancarpag(){
            setPagAtual(getPagAtual()+1);
        }
        void VoltarPag(){
            pagAtual--;
        }
	        void setNome(string n){
            nome=n;
        }
        void setAutor(string a){
            autor=a;
        }
        void setTotalPag(int p){
            totalPag=p;
        }
        void setPagAtual(int a){
            pagAtual=a;
        }
        void setAberto(bool a){
            aberto=a;
        }
        string getNome(){
            return nome;
        }
        string getAutor(){
        return autor;
        }
        int getTotalPag(){
            return totalPag;
        }
        int getPagAtual(){
            return pagAtual;
        }
        bool getAberto(){
            return aberto;
        }
	};
	int main() {
    Pessoa *p1=new Pessoa("willy",31,"M");
	
    
    return 0;
}
	

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Amigo... tomei a liberdade de fazer umas mudanças no seu código, umas para facilitar o entendimento e outras simplesmente para que o programa funcionasse.

Para facilitar o entendimento da questão eliminei todas as funções deixando somente os construtores, o problema como bem comentas, está nos construtores e não nas funções. Depois é só voltar a inserir as funções.

Aparte das funçoes que foram retiradas modifiquei o construtor da classe Pessoa. Troquei:

Pessoa(string n, int i,string s){ setNome(n); setIdade(i); setSexo(s); }


Por:

Pessoa ( string n, int i, string s ) {   nome = n; idade = i; sexo = s; }


Os motivos são óbvios... como falei antes retirei todas as funções pelo qual o primeiro construtor daria problemas.
 

Bom.... vamos a ver se damos luz ao problema.

Primeiro vc deve saber que vc tem 2 coisas diferentes nas sua classe Livro. Vc tem um objeto do tipo Pessoa adicionado mediante "Agregação" que é:

Pessoa leitor;

Que esta dentro da classe Livro.

E vc também recebe o livro por herança.

class Livro: public Pessoa 


Para resolver o problema bastaria vc usar a "Lista de Inicialização" da sua classe e inicializar ambos objetos em ordem de procedência, é dizer.... primeiro o que vc recebe por herança e depois os outros, porem sempre em ordem na qual foram declarados.

#include <iostream>
#include <string>
using namespace std;

class Pessoa {
public:
    Pessoa ( string n, int i, string s ) {   nome = n; idade = i; sexo = s; }

private:
    string nome, sexo;
    int idade;
};

class Livro: public Pessoa {
public:
    Livro ( string n, int t, string a, Pessoa l ) 
    : Pessoa(l), leitor(l)
    {   
        totalPag = t; 
        nome = n; 
        autor = a;         
    }

private:
    string nome,     autor;
    int    totalPag, pagAtual;
    bool   aberto;
    Pessoa leitor;
};

int main() {
    Pessoa *p1 = new Pessoa ( "willy", 31, "M" );
    
    
    return 0;
}

 

A lista de inicialização é a parte:

: Pessoa(l), leitor(l)

Pessoa(l) é o que vc recebeu por herança, também poderia estar como Pessoa::Pessoa(l).
Depois esta o construtor do objeto leitor(l).

Também poderia ser usado a Lista de Inicialização para as outras variáveis tipo:

    Livro ( string n, int t, string a, Pessoa l ) 
    : Pessoa(l), nome(n), autor(a), totalPag(t), pagAtual(0), aberto(false), leitor(l)
    {}

Porem note que estão na ordem na qual foram declaradas começando com a variável que foi declarada primeira.
A forma por Lista de inicialização é inicializada antes que as demais que se encontram dentro dos parêntesis {} por isso é muito usado para os construtores, o resto pode ir dentro dos parêntesis. Imagine que vc precisa de um objeto inicializado antes que outras variáveis.

Se vc usar os parêntesis em vez de usar a Lista de Inicialização vc estará primeiro declarando e depois inicializando.

#include <iostream>
using namespace std;

class Passaro {
public:
    Passaro ( string umNome ) {
        
        cout << "Passaro ja tem nome?: " << seuNome << endl;
        
        seuNome = umNome;
        cout << "Agora sim: " << seuNome << endl;

    }

private:
    string seuNome;
};
int main (){
    Passaro p("Picapau");
    
    cin.ignore();
    return 0;
}

Esse é o exemplo sem a Lista de Inicialização, então quando entrar nos parêntesis só vai passar a ter nome quando chegar na linha seuNome = umNome. Porem da seguinte forma usando lista de inicialização vc verá que antes de entrar nos parêntesis o pássaro já tem nome.

#include <iostream>
using namespace std;

class Passaro {
public:
    Passaro ( string umNome ) 
    : seuNome(umNome)
    {
        cout << "Passaro ja tem nome?: " << seuNome << endl;

    }

private:
    string seuNome;
};
int main (){
    Passaro p("Picapau");
    
    cin.ignore();
    return 0;
}

Por isso é bom sempre usar lista de inicialização com classes herdadas, pode ser que seu programa necessite que as variáveis estejam inicializadas antes de entrar nos parêntesis do construtor.


 

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

  • 0

vangodp

Muito obrigado mesmo meu rei, obrigado por tirar essa dúvida e pela aula. Estou vendo uma aula de POO mas o professor programa em php então quando tento fazer em c++ tenho dificuldades. Já tinha visto uma aula em um app que era bom eu me acostumar a sempre usar as listas de inicializações (para todos os casos) e agora vejo o porque rs.

funcionou certinho aqui, mais uma vez obrigado.

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...