【问题标题】:Can't seem to push_back abstract objects into vector? [duplicate]似乎无法将抽象对象推回向量中? [复制]
【发布时间】:2019-10-31 04:49:04
【问题描述】:

我正在尝试为两种类型的用户创建一个向量。 Admin 和 Customer 都派生自抽象类 BaseUser。但是我尝试了一些在线提供的答案,但我似乎无法完成这项工作。我不断收到error: use of delete function 'std::unique_ptr<...

我仍在努力完全掌握指针的概念,所以这可能就是我遇到这个问题的原因。

#ifndef BASEUSER_H
#define BASEUSER_H

#include <string>

class BaseUser 
{
    private:
        int id;
        int idCounter = 0;
        std::string fullname;
        std::string username;
        std::string password;

    protected:
        bool isAdmin;

    public:
        BaseUser();
        BaseUser(std::string fullname, std::string username, std::string password);

        virtual void setIsAdmin(bool isAdmin) = 0; 
        void setID(int id);

        void setFullname(std::string fullname);
        void setUsername(std::string username);
        void setPassword(std::string password);

        unsigned long int getID();
        std::string getFullname();
        std::string getUsername();
        std::string getPassword();


};

#endif
#ifndef ADMIN_H
#define ADMIN_H

#include "BaseUser.h"

class Admin : public BaseUser
{
    public:
        Admin(std::string fullname,std::string username,std::string password);

        void setIsAdmin(bool isAdmin); 
        bool getIsAdmin();
};

#endif
#ifndef USERMANAGER_H
#define USERMANAGER_H

#include "Admin.h"
#include "Customer.h"
#include <vector>
#include <memory>

class UserManager
{
    private:
        std::vector<std::unique_ptr<BaseUser>> users;
        bool isAuthenticated;

    public:
        std::vector<std::unique_ptr<BaseUser>> getUsers();

        bool login(std::string name, std::string password);
        bool logout();

        void createAdmin(Admin);
        // void createCustomer(Customer);

};

#endif

usermanager类中的对象创建方法声明:

void UserManager::createAdmin(Admin admin))
{   
    users.push_back( move(admin) )
}

我也尝试过使用make_unique推送,但还是同样的错误。

将对象返回给 createAdmin() 方法的视图

// View.cpp

Admin View::createAdminView()
{
    string fullname, username, password;

    cout << "~ Register Admin ~" << endl << endl;

    cout << "Name: ";
    cin.ignore();
    getline(cin, fullname);

    cout << "Username: ";
    cin >> username;

    cout << "Password: ";
    cin >> password;

    return Admin(fullname, username, password);
}

【问题讨论】:

  • @Ron 这与零规则(或更小的变体)关系不大,它说明了在实现其他特殊功能时应该实现哪些特殊功能。
  • 您正在将值类型 Admin 推送到 vectorunique_ptr&lt;BaseUser&gt;。你应该推(移动)一个unique_ptr&lt;Admin&gt;(这将被默默地转换为unique_ptr&lt;BaseUser&gt;)!

标签: c++ vector data-structures abstract-class unique-ptr


【解决方案1】:

尝试将 createAdmin 更改为:

void UserManager::createAdmin(Admin admin)
{   
    users.push_back( std::make_unique<Admin>(admin) );
}

vector&lt;T&gt;push_back 想要const T&amp; 或(在这种情况下)T&amp;&amp;

【讨论】:

  • 为什么不改变参数来获取unique_ptr?
  • @AdrielJr:我希望两者都显示make_unique 的使用,并进行最小的更改。
  • 我在这里看到了很多 admin 副本:首先是通过值传递 admin 时,然后在创建基于 admin 的唯一指针时。另外,从 c++11 开始,我总是使用 emplace_back。在这种情况下,它应该没有任何区别,因为它是一个指针向量,但是在处理对象时,它可能会避免另一个副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2011-06-23
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多