【发布时间】:2014-09-23 19:32:08
【问题描述】:
我是 C++ 新手,在让 vector.erase 操作正常工作时遇到困难。
我有一个这样的数据库类:
template <class T> class Database
{
protected:
std::vector<T> m_database;
int m_counter;
public:
Database();
virtual ~Database();
// Accessor Methods.
T& getObject(int objectId);
bool exists(int objectId);
// Mutator Methods.
void add(T Object);
void del(int objectId);
};
实际上,我是这样使用代码的:
Database<Account> accountDatabase;
Account 是一个基类,有两个派生类ChequingAccount 和SavingsAccount。
我正在使用以下方法将帐户(可能是Account、ChequingAccount、SavingsAccount)插入到此数据库中:
template <class T> void Database<T>::add(T object)
{
m_database.push_back(object);
++m_counter;
}
但是,我的删除操作有问题。我正在搜索相应的objectId,然后将其从向量中删除。
// Deletes the specified object from the database.
template <class T> void Database<T>::del(int objectId)
{
std::vector<T>& database = m_database;
typename std::vector<T>::iterator it = database.begin();
while (it != database.end()) {
if ((*it).getId() == objectId) {
it = database.erase(it);
} else {
++it;
}
}
}
不幸的是,删除操作根本不起作用。我在从数据库中提取派生类时也遇到问题,因为所有内容都作为Account 类型提取。我相信这两个问题与我的菜鸟 C++ 技能和糟糕的设计有关。
任何帮助将不胜感激!谢谢!
编辑
不工作,我的意思是对象没有从数据库中删除。对于任何混淆,我深表歉意。
帐户类:
class Account
{
protected:
int m_id;
double m_balance;
std::string m_name, m_type;
public:
Account(int id, int userId, double balance = 0, std::string name = ""); // Constructor.
~Account(); // Destructor.
// Accessor Methods.
// This returns m_id AKA objectId
int getId() const;
}
class ChequingAccount: public Account
{
public:
ChequingAccount(int id, int userId, double balance, std::string name) : Account(id, userId, balance, name) {}
}
class SavingsAccount: public Account
{
public:
SavingsAccount(int id, int userId, double balance, std::string name) : Account(id, userId, balance, name) {}
}
【问题讨论】:
-
1. “根本不工作”是什么意思? 2. 为什么不用
std::remove? -
发布帐户可能会有所帮助
-
deleting while iterating 的可能重复项
-
@Raymond 这略有不同,因为用户正确地将迭代器结果从调用
std::vector<t>::erase(iterator)重新分配 -
您的
del()看起来不错,所以不妨检查一下您的id是否正确?
标签: c++ templates inheritance vector