繁体   English   中英

对向量的擦除操作不起作用

[英]Erase operation on vector not working

我是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是一个基类,具有两个派生类ChequingAccountSavingsAccount

我正在使用以下方法将帐户(无论类型如何(可以是AccountChequingAccountSavingsAccount ))插入此数据库:

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类型被提取出来。 我相信这两个问题与我的noob 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) {}
}

请注意,就std::remove_if而言,您的remove函数会更好:

auto endIterator = std::remove_if(m_database.begin(), m_database.end(),
    [=](T const& entry) { return entry.getId() == objectId; }
    );
m_database.erase(endIterator, m_database.end());

也就是说,您的版本看起来并不正确,只是效率低下。 那“行不通”呢? 我确实注意到您在数据库中维护了一个单独的对象ID,但从未将其实际放入存储的对象中。

您的del函数看起来正确,仅建议而不是:

(*it).getId()

您可以/应该使用:

it->getId()

更简单易读。 所以罪魁祸首在别的地方。 至于问题,一切都作为Account类型拉出,您有切片问题,详细信息在这里阅读什么是对象切片?

您将类Database作为模板并没有改变任何事实,您可能会误解模板的作用。 您的Database<Account>无非是您将使用Account而不是T并且完全不使用模板,并且您插入了从Value继承自Account的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM