【发布时间】: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推送到vector的unique_ptr<BaseUser>。你应该推(移动)一个unique_ptr<Admin>(这将被默默地转换为unique_ptr<BaseUser>)!
标签: c++ vector data-structures abstract-class unique-ptr