Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 2 da Aula 9 - Mão na Massa - OO (referência nula)

Estou tentando realizar um saque como no exemplo porén ao tentar o visual studio me alerta para uma referência nula no campo

c.titular.idade = 19;

Segue meu código:

//form

namespace CaixaEletronico2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Conta c = new Conta();
            c.Deposita(160.0);
            c.titular.idade = 19;

            if (c.Saca(150.0))
            {
                MessageBox.Show("Saque Realizado com sucesso");
            }
            else
            {
                MessageBox.Show("Não foi possível realizar o saque");
            }
        }
    }
}


// class Conta 

class Conta
    {
        public int numero;
        public double saldo;
        public Cliente titular;
        public Cliente cliente;

        public bool Saca(double valor)
        {
            if (valor >= this.saldo || valor <= 0)
            {
                return false;
            }
            else
            {
                if (this.cliente.EhmaiordeIdade())
                {
                    this.saldo -= valor;
                    return true;
                }
                else
                {
                    return false;
                }

            }

        }

        public void Deposita(double valor)
        {
            if (valor >= 0)
            {
                this.saldo += valor;
            }
        }

        public void Transfere(double valor, Conta destino)
        {
            this.Saca(valor);
            destino.Deposita(valor);
        }

    }


//class cliente

class Cliente
    {
        public string nome;
        public string rg;
        public string cpf;
        public string endereco;

        public int idade;

        public bool EhmaiordeIdade()
        {
            return idade >= 18;
        }
2 respostas
solução!

Oi Vinícius, tudo bem?

A primeira coisa que faltou, foi atribuir a referência para um cliente na variável titular antes de tentar atribuir a idade. Nesse caso, titular é nulo, e quando você tenta acessar idade em titular, recebe o erro.

No código do Form você pode fazer o seguinte:

private void button1_Click(object sender, EventArgs e)
{
    Conta c = new Conta();
    c.Deposita(160.0);
    Cliente cli = new Cliente(); // Cria um objeto Cliente e atribui a referencia para cli
    c.titular = cli; // atribui a mesma referencia de cli para titular
    c.titular.idade = 19;

    if (c.Saca(150.0))
    {
        MessageBox.Show("Saque Realizado com sucesso");
    }
    else
    {
        MessageBox.Show("Não foi possível realizar o saque");
    }
}

Um outro erro, é o fato de você ter duas variáveis do tipo Cliente em sua classe conta, e no método Saca, você está testando se a variável cliente é maior de idade. Nesse ponto a variável cliente é null. Pode deixar a classe Conta apenas com uma variável do tipo Cliente. Nesse caso deixei a varável titular:

class Conta
{
public int numero;
public double saldo;
public Cliente titular;

public bool Saca(double valor)
{
    if (valor >= this.saldo || valor <= 0)
    {
        return false;
    }
    else
    {
        if (this.titular.EhmaiordeIdade())
        {
            this.saldo -= valor;
            return true;
        }
        else
        {
            return false;
        }

    }

}

public void Deposita(double valor)
{
    if (valor >= 0)
    {
        this.saldo += valor;
    }
}

public void Transfere(double valor, Conta destino)
{
    this.Saca(valor);
    destino.Deposita(valor);
}

}

Faz sentido?

Testa e vê se funciona. Um abraço.

Excelente Lucas, muito obrigado!

Ainda havia um erro no método EhmaiorDeIdade, mas foi só trocar cliente pot titular que funcionou.

Obrigado pela ajuda!