从指针 class 属性访问对象属性时出现问题

Problem accessing object attributes from a pointer class attribute

我有以下 class:

class Customer {

private:
    string name;
    savingAccount *savingsAccount = nullptr;
public:
   void setSavingsAccount(savingAccount savingsAccount);
   savingAccount* getSavingsAccount();

和方法:

savingAccount* Customer::getSavingsAccount()
{
    return this->savingsAccount;
}

void Customer::setSavingsAccount(savingAccount savingsAccount)
{
    this->savingsAccount = &savingsAccount;
}

savingsAccount class 派生自帐户结构:

struct account {
private:
    double balance;
    double interestRate;
    double interest;
    const string accountType = "Base Account";

public:
    account();
    double getBalance();
    double getIntRate();
    double calculateInterest(int n);
    void setBalance(double balance);
    void setIntRate(double rate);
    string getType();

};

class savingAccount : public account {
public:
    double savingDepositArr[5];
    const string accountType = "Saving Account";

现在的问题: 我正在创建 SavingsAccount 和 Customer 对象。

savingAccount newSavingAccount;
Customer customer;
customer.setSavingsAccount(newSavingAccount);

当我尝试通过 getSavingsAccount 访问任何内容时,我无法访问。

customer.getSavingsAccount.getBalance()
customer.getSavingsAccount().getBalance()

customer.getSavingsAccount.accountType

我 100% 确定我没有正确使用指针。我一直在寻找解决方案很长一段时间,但仍然一无所获。如果我删除指针并将对象作为属性,它可以工作,但这不是我正在寻找的解决方案。我只想知道我做错了什么。

getSavingsAccount() returns 指向储蓄账户的指针。如果您正在使用指向对象的指针,则无法使用 . 访问属性(除非您取消引用)。您可以通过 shorthand ->.

访问属性(无需取消引用)

尝试customer.getSavingsAccount()->getBalance()

Customer::getSavingsAccount() returns 指向 savingAccount 对象的 指针 。要访问该对象的成员,您需要使用 * 运算符取消引用指针,然后使用 . 运算符访问成员。或者,您可以使用更短的 -> 运算符:

(*customer.getSavingsAccount()).getBalance()
customer.getSavingsAccount()->getBalance()

话虽如此,请注意 Customer::setSavingsAccount() 按值 接收 savingAccount 对象 ,因此 copy 传入输入对象。setSavingsAccount() 保存指向该 copy 的指针。当 setSavingsAccount() 退出时,copy 被销毁,留下指针 dangling 指向无效内存。因此,您之后尝试执行的任何涉及取消引用该指针的操作都将导致 未定义的行为

对于您正在尝试做的事情,请 setSavingsAccount()savingAccount 对象 通过引用 代替,例如:

class Customer {
private:
    ...
    savingAccount *savingsAccount = nullptr;
public:
   void setSavingsAccount(savingAccount &savingsAccount);
   ...
};

void Customer::setSavingsAccount(savingAccount &savingsAccount)
{
    this->savingsAccount = &savingsAccount;
}

只要确保输入的 savingAccount 对象比 Customer 对象长,否则你仍然会得到一个 悬空 指针。

另一种解决方案是使用 std::unique_ptrstd::shared_ptr,例如:

#include <memory>

class Customer {
private:
    ...
    std::unique_ptr<savingAccount> savingsAccount;
public:
   void setSavingsAccount(std::unique_ptr<savingAccount> savingsAccount);
   savingAccount* getSavingsAccount();
};

savingAccount* Customer::getSavingsAccount()
{
    return this->savingsAccount.get();
}

void Customer::setSavingsAccount(std::unique_ptr<savingAccount> savingsAccount)
{
    this->savingsAccount = std::move(savingsAccount);
}
auto newSavingAccount = std::make_unique<savingAccount>();
Customer customer;
customer.setSavingsAccount(std::move(newSavingAccount));
...
customer.getSavingsAccount()->getBalance();
customer.getSavingsAccount()->accountType;

或者:

#include <memory>

class Customer {
private:
    ...
    std::shared_ptr<savingAccount> savingsAccount;
public:
   void setSavingsAccount(std::shared_ptr<savingAccount> savingsAccount);
   std::shared_ptr<savingAccount> getSavingsAccount();
};

std:shared_ptr<savingAccount> Customer::getSavingsAccount()
{
    return this->savingsAccount;
}

void Customer::setSavingsAccount(std::shared_ptr<savingAccount> savingsAccount)
{
    this->savingsAccount = savingsAccount;
}
auto newSavingAccount = std::make_shared<savingAccount>();
Customer customer;
customer.setSavingsAccount(newSavingAccount);
...
customer.getSavingsAccount()->getBalance();
customer.getSavingsAccount()->accountType;