微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ Setter 不会改变对象的变量值

如何解决C++ Setter 不会改变对象的变量值

我试图运行一个代码,它的目的是在创建对象后更改对象变量的值,并且它没有改变,然后变量返回像 -815470397 这样的值并且没有改变。当我使用断点时,它就像跳过了 setter 的内部部分。

Pessoa.h

#pragma once
using namespace std;
class Pessoa
{

protected:
    int dia;
    int mes;
    int ano;
    int idade;

public:
    Pessoa();
    Pessoa(int,int,int);

    int GetDia();
    void SetDia(int);
    int GetMes();
    void SetMes(int);
    int GetAno();
    void SetAno(int);
    int GetIdade();
    void SetIdade(int);

};

Pessoa.cpp

#include "Pessoa.h"

Pessoa::Pessoa() {

}

Pessoa::Pessoa(int dia,int mes,int ano,int idade) {

    this->dia = dia;
    this->mes = mes;
    this->ano = ano;
    this->idade = idade;
}

int Pessoa::GetDia() {
    return this->dia;
}

int Pessoa::GetMes() {
    return this->mes;
}

int Pessoa::GetAno() {
    return this->ano;
}

int Pessoa::GetIdade() {
    return this->idade;
}

void Pessoa::SetDia(int dia) {
    this->dia == dia;
}

void Pessoa::SetMes(int mes) {
    this->mes == mes;
}

void Pessoa::SetAno(int ano) {
    this->ano == ano;
}

void Pessoa::SetIdade(int idade) {
    this->idade == idade;
}

Exame_especial.cpp

#include <iostream>
#include <string>
#include "Pessoa.h"
using namespace std;

string ImprimeIdade(Pessoa*);
int Calc_Idade(Pessoa*,int);

int main()
{
    Pessoa* Einstein = new Pessoa();
    Pessoa* Newton = new Pessoa();

    Einstein->SetDia(14);
    Einstein->SetMes(3);
    Einstein->SetAno(1879);
    Newton->SetDia(4);
    Newton->SetMes(1);
    Newton->SetAno(1643);

    cout << ImprimeIdade(Newton) << endl;
    cout << ImprimeIdade(Einstein) << endl;

}

string ImprimeIdade(Pessoa* nome) {
    nome->SetIdade(Calc_Idade(nome,29,6,2021));
    return "A idade de Einstein seria " + to_string(nome->GetIdade()) + "\n";
}


int Calc_Idade(Pessoa* nome,int dia,int ano) {
    int idade = ano - nome->GetAno();
    if (nome->GetMes() > mes) {
        idade = idade - 1;
    }
    else {
        if (nome->GetMes() == mes) {
            if (nome->GetDia() > dia) {
                idade = idade - 1;
            }
        }
    }
    return idade;
}

解决方法

您得到这些奇怪的值是因为您的数据成员是内置类型,并且在您使用它们时保持未初始化。它们保持未初始化状态,因为您的 setter 没有设置任何内容。他们实际上做的是比较(==)

注意这两者的区别:

void Pessoa::SetDia(int dia) {
    this->dia == dia; // Equal? Returns bool value which is lost 
}

对比

void Pessoa::SetDia(int new_dia) {
    this->dia = new_dia; // Assigns a new value
}

这适用于代码中的所有 setter。

另外,请注意,在成员函数体内,您可以直接引用数据成员,而无需通过 this 取消引用它们:

void Pessoa::SetDia(int new_dia) {
    // Assigns new value to the dia data member of this
    dia = new_dia;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。