c++ - c ++试图在不存在的构造函数中引用已删除的函数(使用rapidJson)
问题描述
我目前收到此错误: 'User::User(const User&)':尝试引用已删除的函数
该程序将对象的字符串值传递给类。
用户构造函数:
User::User(string s){
int size = s.length() + 1;
char* cstr = new char[size];
strcpy_s(cstr, size, s.c_str());
user.Parse(cstr);
}
主循环:
int main(){
//json equals something similar to this: "{\"body:{[{"user":1},{"user":1},{"user":1}]}\"}";
const char * json;
Document d;
d.Parse(json);
if (d.HasMember("body")) {
if (d["body"].IsArray()) {
for (SizeType i = 0; i < d["body"].Size(); i++) {
string json = getJsonString(d["body"][i]);
User u = User(json); \\this is where the error point to
this->users.push_back(u);
}
}
}
}
getJsonString 函数:
string getJsonString(Value& value) {
StringBuffer buffer;
buffer.Clear();
Writer<StringBuffer> writer(buffer);
value.Accept(writer);
return string(buffer.GetString());
}
我搜索了很多关于这个错误的解释,但对我来说似乎没有任何意义。我认为它与向量数组有关,但它对我来说没有意义,因为我没有使用指针或引用来表示任何用户值。它似乎指向构造函数,但是没有传递指针或引用。我通过返回json的字符串,我没有使用指针,但也许我实际上是?对于我做错的任何解释,我将不胜感激。
解决方案
User
不可复制;这意味着:
User::User(const User&)
(复制构造函数)是private
- 或删除 (
= delete;
) - 或隐式删除(例如,类具有不可复制的成员,或从不可复制的类继承)。谢谢 Yksisarvinen 的评论
这意味着您不能User
从另一个创建新的。
然后,如果你想将User
对象存储在一个vector
(因为你“显然”试图在你的帖子中做,我说“显然”因为发布的代码没有编译,我不知道是谁this
)你不能按值存储它们,因为包含的vector
需要一个可访问的复制构造函数。
T
必须满足 和 的CopyAssignable
要求CopyConstructible
。
但是,您可以将它们存储为指针:
std::vector<std::shared_ptr<User>> users;
users.push_back( std::shared_ptr<User>( new User( json ) );
推荐阅读
- visual-studio - 无法为 postgresql 使用 entityframework + npgsql 创建 .edmx 文件
- database - 如何编译预编译的“.dll”SQLite 文件并获取“.exe”文件以进行安装?
- sql - Select 语句 where joins 导致记录被排除
- python - Celery:我可以使用 Celery 一次执行一个函数实例吗?
- sql - 如果行以 \ 结尾,则 sp_executesql 失败
- c# - WinForms 应用程序中的 Windows 10 ToastNotification
- node.js - 无法在分区中设置检查点
- c# - SMTP 电子邮件在本地工作,但不适用于 Devops
- python - 如何在 0815 开始 celery 周期性任务并在 django 中每 15 分钟运行一次
- konvajs - 如何改变变压器旋转图标的位置