似乎无法将抽象对象推回向量中吗?

时间:2019-06-17 14:57:28

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

我正在尝试为两种类型的用户创建一个向量。 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);
}

1 个答案:

答案 0 :(得分:1)

尝试将createAdmin更改为此:

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

vector<T>想要const T&或(在这种情况下)是T&&