gpt4 book ai didi

C++ 从指针 vector 中删除元素

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

我正在使用一个指针 vector 来实现继承目的,并且我的每一个行为都应该如此,但是,我在从 vector 中删除对象时遇到了问题。

我已经创建了一个包含所有源文件的 Github gist,以及一个便于编译和运行的 Makefile:

https://gist.github.com/anonymous/7c689940992f5986f51e

本质上就是问题所在:

我有一个 Bank 类(注意账户数据库结构,它是账户 * 的封装 vector ):

class Bank
{
private:
Database<Account> m_acctDb;
Database<User> m_userDb;
int m_accountCounter;
int m_userCounter;
public:
Bank ();
~Bank ();

// Accessor Methods.
int getAccountCounter () const;
int getUserCounter () const;
int getNumAccounts () const;
int getNumUsers () const;
Database<Account> getAccountDatabase () const;
Database<User> getUserDatabase () const;
User *getUser (int userId);
Account *getAccount (int accountId);
std::vector<ChequingAccount> getChequingAccounts () const;
std::vector<SavingsAccount> getSavingsAccounts () const;
std::vector<Manager> getManagers () const;
std::vector<Customer> getCustomers () const;
std::vector<Maintenance> getMaintenance () const;

// Mutator Methods.
void addChequing (int userId, double balance = 0, std::string name =
"");
void addSavings (int userId, double balance = 0,
std::string name = "");
void addCustomer (std::string firstName, std::string lastName,
std::string password, std::string username);
void addManager (std::string firstName, std::string lastName,
std::string password, std::string username);
void addMaintenance (std::string firstName, std::string lastName,
std::string password, std::string username);
void deleteAccount (int accountId);
void deleteUser (int userId);
};

我有一个模板数据库类,它创建指针 vector :

template<class T>
class Database
{
protected:
std::vector<T*> m_database;
public:
Database ();
virtual ~Database ();
std::vector<T*> getDatabase () const;
void add (T *Object);
bool del (int id);
};

在我的银行中,我添加了如下定义的 Account 对象:

class Account
{
protected:
int m_id, m_userId, m_type;
double m_balance;
std::string m_name;
std::vector<std::string> m_history;
public:
Account (int id, int userId, double balance = 0,
std::string name = "");
virtual ~Account ();

// Accessor Methods.
int getId () const;
int getUserId () const;
int getType () const;
double getBalance () const;
std::string getName () const;
std::string getDetails () const;
std::vector<std::string> getHistory () const;

// Mutator Methods.
void setName (std::string name);
void depositFunds (double amount);
virtual bool withdrawFunds (double amount);
};

/*
* Chequing account type
*/
class ChequingAccount : public Account
{
public:
ChequingAccount (int id, int userId, double balance = 0,
std::string name = "") :
Account(id, userId, balance, name)
{
// Chequing account type.
m_type = CHEQ;

// If no name was given.
if (name == "")
{
// Give account a generic name.
m_name = "Chequing Account #" + std::to_string(id);
}
else
{
m_name = name;
}
}

~ChequingAccount ()
{
}

virtual bool withdrawFunds (double amount);
};

/*
* Savings account type
*/
class SavingsAccount : public Account
{
public:
SavingsAccount (int id, int userId, double balance, std::string name) :
Account(id, userId, balance, name)
{
// Savings account type.
m_type = SAVE;

// If no name was given.
if (name == "")
{
// Give account a generic name.
m_name = "Savings Account #" + std::to_string(id);
}
else
{
m_name = name;
}
}

~SavingsAccount ()
{
}
};

我正在将帐户对象(主要是支票/储蓄帐户,它们是基帐户类的派生类)添加到银行中:

/*
* Adds a new chequing account to the bank database.
*/
void Bank::addChequing (int userId, double balance, std::string name)
{
m_acctDb.add(new ChequingAccount(++m_accountCounter, userId, balance, name));
}

/*
* Adds a new savings account to the bank database.
*/
void Bank::addSavings (int userId, double balance, std::string name)
{
m_acctDb.add(new SavingsAccount(++m_accountCounter, userId, balance, name));
}

这一切工作正常,我能够从数据库中提取对象并按照我喜欢的方式进行操作。问题在于删除,其定义如下:

/*
* Deletes the specified account from the bank database.
*/
void Bank::deleteAccount (int accountId)
{
std::vector<Account*> db = m_acctDb.getDatabase();
std::vector<Account*>::iterator it = db.begin();
cout << "Searching for account " << accountId << endl;
while (it != db.end())
{
if ((*it)->getId() == accountId)
{
cout << "Found account 1" << endl;
// Delete selected account.
delete (*it);
it = db.erase(db.begin());
}
else ++it;
}
}

我创建了一个小测试文件来测试所有功能:

int main ()
{
Bank bank;

cout << "Num accounts in bank: " << bank.getNumAccounts() << endl << endl;

cout << "Adding accounts to bank..." << endl;
bank.addChequing(1, 1500.0, "testchq");
bank.addSavings(1, 2000.0, "testsav");

cout << "Num accounts in bank: " << bank.getNumAccounts() << endl;
for (int i = 0; i < bank.getNumAccounts(); ++i)
{
if (bank.getAccount(i + 1) == NULL) cout << "Account is NULL" << endl;
else
{
cout << bank.getAccount(i + 1)->getDetails() << endl;
}
}
cout << endl;

cout << "Deleting account 1..." << endl;
bank.deleteAccount(1);
cout << endl;

cout << "Num accounts in bank: " << bank.getNumAccounts() << endl;
for (int i = 0; i < bank.getNumAccounts(); ++i)
{
if (bank.getAccount(i + 1) == NULL) cout << "Account is NULL" << endl;
else
{
cout << bank.getAccount(i + 1)->getDetails() << endl;
}
}
}

这是运行文件后得到的输出:

Num accounts in bank: 0

Adding accounts to bank...
Num accounts in bank: 2
Account #1 [C] testchq $1500.000000
Account #2 [S] testsav $2000.000000

Deleting account 1...
Searching for account 1
Found account 1

Num accounts in bank: 2
Account #1 [C] [C] $1500.000000
Account #2 [S] testsav $2000.000000

如您所见,它正确地添加了派生的 Account 类,并在没有对象切片的情况下保留了它们的派生类型。在删除函数中,可以看到删除函数正在正确找到应该删除的账户。问题是虽然它应该删除帐户 #1,但它没有删除,但它确实删除了帐户名称(如 Account #1 [C] [C] $1500.000000Account 所示#1 [C] testchq $1500.000000).

我在这里遇到的问题是什么?我也不确定我这样做的方法,因此非常感谢任何改进建议。

提前致谢!

最佳答案

您要从拷贝中删除帐户:

std::vector<T*> getDatabase () const;

std::vector<Account*> db = m_acctDb.getDatabase();

您需要从实际数据库中删除,因此您希望用法为:

std::vector<T*>& getDatabase ();
const std::vector<T*>& getDatabase () const;

std::vector<Account*>& db = m_acctDb.getDatabase();

关于C++ 从指针 vector 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094006/

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