首页 > 解决方案 > 似乎无法将抽象对象推回向量中?

问题描述

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

标签: c++vectordata-structuresabstract-classunique-ptr

解决方案


尝试将 createAdmin 更改为:

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

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


推荐阅读