C++ Can';你似乎没有把抽象的对象推回向量?
我试图为两种类型的用户创建一个向量。Admin和Customer都是从抽象类BaseUser派生的。然而,我尝试了一些网上提供的答案,但我似乎无法做到这一点。我不断收到C++ Can';你似乎没有把抽象的对象推回向量?,c++,vector,data-structures,abstract-class,unique-ptr,C++,Vector,Data Structures,Abstract Class,Unique Ptr,我试图为两种类型的用户创建一个向量。Admin和Customer都是从抽象类BaseUser派生的。然而,我尝试了一些网上提供的答案,但我似乎无法做到这一点。我不断收到错误:使用删除函数'std::unique_ptr尝试将createAdmin更改为: void UserManager::createAdmin(Admin admin) { users.push_back( std::make_unique<Admin>(admin) ); } void UserM
错误:使用删除函数'std::unique_ptr尝试将createAdmin更改为:
void UserManager::createAdmin(Admin admin)
{
users.push_back( std::make_unique<Admin>(admin) );
}
void UserManager::createAdmin(Admin-Admin)
{
push_back(std::make_unique(admin));
}
push_
一个向量
需要一个常数T&
或(在本例中)一个T&@Ron这与零规则(或更小的变化)关系不大,说明在实现其他特殊功能时应实现哪些特殊功能。您正在将值类型Admin
推送到unique\ptr
的vector
。您应该(通过移动)推送一个unique\u ptr
(这将自动转换为unique\u ptr
)!为什么不更改参数以获得唯一的\u ptr?@AdrielJr:我想显示make\u unique
的用法,并进行最小的更改。我在这里看到了许多admin副本:首先是按值传递admin,然后是基于admin创建唯一指针。另外,由于c++11,我总是使用emplace_back。在这种情况下,它不应该有任何区别,因为它是指针的向量,但在处理对象时,它可能会避免另一个副本。
#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
void UserManager::createAdmin(Admin admin))
{
users.push_back( move(admin) )
}
// 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);
}
void UserManager::createAdmin(Admin admin)
{
users.push_back( std::make_unique<Admin>(admin) );
}