c++ 通过引用传递 json 对象
c++ passing json object by reference
在下面的代码中,我从客户端接收请求,将它们放在我的服务器 class 上的 json 对象上,并将其发送到推送器(直接连接到网站,把我的数据放在那里,这样我就可以轻松地搜索数据)
代码运行良好,但我的经理说我需要在此代码中通过引用传递 json,我不知道该怎么做。
在服务器 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);
}
...
}
在推手上 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());
...
}
据我所知,我需要通过引用发送 json 对象。我该怎么做?
简单的答案就是改变
void Pusher::jsonCollector(nlohmann::json dump)
到
void Pusher::jsonCollector(const nlohmann::json& dump)
(请注意,如果它位于 class 内,则 Pusher::
是 non-standard visual studio 扩展)。
这会将对象复制的次数从 2 次减少到 1 次,但是您可以使用 std::move
:
完全避免复制
void Pusher::jsonCollector(nlohmann::json dump){
queue.push_back(std::move(dump));
}
并调用它:
pusher.jsonCollector(std::move(obj));
如果您想强制执行此行为以确保 jsonCollector
的调用者始终使用 std::move
,您可以将 jsonCollector
更改为:
void Pusher::jsonCollector(nlohmann::json&& dump){
queue.push_back(std::move(dump));
}
嗯,引用是区分 C 和 C++ 的众多特征之一。
在其他语言中,如 python 或 java,当您将对象(不是基本类型)传递给函数并在那里更改它时,它也会在调用方实体中更改。在这些语言中,你没有指针,但你需要传递对象,而不是副本。
这就是 C++ 中的引用。它们像值类型一样使用,但它们不是副本。
指针可以是 nullptr
(或 C 中的 NULL
),引用不能。指针指向的地址可以改变(赋值),不能改变引用指向的对象。
查看此 https://en.cppreference.com/w/cpp/language/reference 了解更多信息。
在下面的代码中,我从客户端接收请求,将它们放在我的服务器 class 上的 json 对象上,并将其发送到推送器(直接连接到网站,把我的数据放在那里,这样我就可以轻松地搜索数据) 代码运行良好,但我的经理说我需要在此代码中通过引用传递 json,我不知道该怎么做。 在服务器 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);
}
...
}
在推手上 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());
...
}
据我所知,我需要通过引用发送 json 对象。我该怎么做?
简单的答案就是改变
void Pusher::jsonCollector(nlohmann::json dump)
到
void Pusher::jsonCollector(const nlohmann::json& dump)
(请注意,如果它位于 class 内,则 Pusher::
是 non-standard visual studio 扩展)。
这会将对象复制的次数从 2 次减少到 1 次,但是您可以使用 std::move
:
void Pusher::jsonCollector(nlohmann::json dump){
queue.push_back(std::move(dump));
}
并调用它:
pusher.jsonCollector(std::move(obj));
如果您想强制执行此行为以确保 jsonCollector
的调用者始终使用 std::move
,您可以将 jsonCollector
更改为:
void Pusher::jsonCollector(nlohmann::json&& dump){
queue.push_back(std::move(dump));
}
嗯,引用是区分 C 和 C++ 的众多特征之一。
在其他语言中,如 python 或 java,当您将对象(不是基本类型)传递给函数并在那里更改它时,它也会在调用方实体中更改。在这些语言中,你没有指针,但你需要传递对象,而不是副本。
这就是 C++ 中的引用。它们像值类型一样使用,但它们不是副本。
指针可以是 nullptr
(或 C 中的 NULL
),引用不能。指针指向的地址可以改变(赋值),不能改变引用指向的对象。
查看此 https://en.cppreference.com/w/cpp/language/reference 了解更多信息。