gpt4 book ai didi

c++ - 在构造函数中初始化一个对象,而不是在初始化列表中

转载 作者:行者123 更新时间:2023-11-30 02:57:43 25 4
gpt4 key购买 nike

我有以下包含 3 种数据类型的类:

   class CentralBank{
MaxHeap richestBanks;
HashTable banks;
AccountTree accounts;

public:
CentralBank(int numAccounts, Account* accounts, int numBanks, Bank* bankArr);
void AddAccount(Account account);
void RemoveAccount(int accountID);
void AddBank(Bank bank);
int GetAccountsNumber(int bankID);
void GetKRichestBanks(unsigned int K, Bank* banks);
int GetSumBalance (int low, int high);

};

这是构造函数:

CentralBank::CentralBank(int numAccounts, Account* accounts, int numBanks,
Bank* bankArr): accounts(numAccounts,accounts){
int** locs = new int*[numBanks];
richestBanks = MaxHeap(numBanks,bankArr, locs);
banks = HashTable(numBanks,bankArr,locs);
delete[] locs;
}

我的问题是堆和哈希表的析构函数在它们的构造函数之后被调用。如果我把它们都变成指针,它就不会发生。为什么会这样?有没有办法让它们不成为指针并且在初始化后不立即调用析构函数?我没有正确初始化它们吗?

PS:它们不在初始化列表中,因为它们的构造函数需要需要初始化的“locs”参数。

最佳答案

一旦进入构造函数的主体,C++ 规则保证该类的所有基类和该类的所有成员 都已初始化。这就是为什么初始化列表在构造函数主体之外的原因;因为它在构造函数主体之前被调用。如果您没有在构造函数的初始化列表中指定构造函数和参数,那么它将被默认初始化。

因此 richestBanksbanks 此时已经初始化。而且您不能两次初始化一个对象。

richestBanks = MaxHeap(numBanks,bankArr, locs);

这样做是创建一个 MaxHeap 临时对象,然后调用复制赋值运算符(或移动赋值,在适当的情况下)将新数据复制到 最富有的银行。在那之后,必须销毁临时对象。这就是您看到的析构函数调用。

正确的解决方案是停止做任何你需要locs的事情,并找到更好的方法来构造你的数据,这样你就可以正确地使用初始化列表。

关于c++ - 在构造函数中初始化一个对象,而不是在初始化列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com