Home > front end >  c passing json object by reference
c passing json object by reference

Time:02-02

In the below code, I am taking requests from a client, put them together on a json object on my server class and sending it to a pusher(directly connected to a website, putting my data in there so I can search data easily) The code is working perfectly fine, but my manager said that I need to pass json by reference in this code, and I have no idea what to do. On Server Class:

grpc::Status RouteGuideImpl::PubEvent(grpc::ServerContext *context, 
                    const events::PubEventRequest *request, 
                    events::PubEventResponse *response){
    for(int i=0; i<request->event_size();i  ){
    nhollman::json object;
    auto message = request->events(i);
    object["uuid"]=message.uuid();
    object["topic"]=message.type();
    pusher.jsonCollector(obj);
    }
    ...
}

On Pusher Class:

private:
    nholmann::json queue = nlohmann::json::array();
public:
    void Pusher::jsonCollector(nlohmann::json dump){
        queue.push_back(dump);
    }
    void Pusher::curlPusher(){
        std::string str = queue.dump();
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, str.data());
...
}

As much as I understand, I need to send the json object by reference. How can I do that?

CodePudding user response:

The simple answer is to change

void Pusher::jsonCollector(nlohmann::json dump)

to

void Pusher::jsonCollector(const nlohmann::json& dump)

(note that if this is inside the class then Pusher:: is a non-standard visual studio extension).

This will reduce the number of times the object is copied from 2 to 1 however you can avoid the copy completely by using std::move:

void Pusher::jsonCollector(nlohmann::json dump){
        queue.push_back(std::move(dump));
    }

And call it with:

pusher.jsonCollector(std::move(obj));

If you want to enforce this behaviour to ensure that callers of jsonCollector always use std::move you can change jsonCollector to:

void Pusher::jsonCollector(nlohmann::json&& dump){
        queue.push_back(std::move(dump));
    }

CodePudding user response:

Well, references are one of the many, many features, that distinguishes C from C .

In other languages, like python or java, when you pass an object (not basic types) to a function and change it there, it is changed in the caller entity as well. In these languages, you don't have pointers, but you need to pass the object, not a copy.

That's what you have with references in C . They are used like value types, but they are no copy. Pointers can be nullptr (or NULL in C), references cannot. The address a pointer points to can be changed (assigned), you cannot change what object a reference refers to.

Have a look at this https://en.cppreference.com/w/cpp/language/reference for more information.

  •  Tags:  
  • Related