首页 > 解决方案 > 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的字符串,我没有使用指针,但也许我实际上是?对于我做错的任何解释,我将不胜感激。

标签: c++rapidjson

解决方案


User不可复制;这意味着:

  • User::User(const User&)(复制构造函数)是private
  • 或删除 ( = delete;)
  • 或隐式删除(例如,类具有不可复制的成员,或从不可复制的类继承)。谢谢 Yksisarvinen 的评论

这意味着您不能User从另一个创建新的。

然后,如果你想将User对象存储在一个vector(因为你“显然”试图在你的帖子中做,我说“显然”因为发布的代码没有编译,我不知道是谁this)你不能按值存储它们,因为包含的vector需要一个可访问的复制构造函数。

std::vector

T必须满足 和 的CopyAssignable要求CopyConstructible

但是,您可以将它们存储为指针:

std::vector<std::shared_ptr<User>> users;
users.push_back( std::shared_ptr<User>( new User( json ) );

推荐阅读