从指针 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_ptr
或 std::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;
我有以下 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_ptr
或 std::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;