假设我有一个REST服务,它使用以下方案返回JSON对象:
{
"id" : 1
"name" : "Peter"
"age" : 25
}
我有一个用C ++编写的应用程序,它接收这个对象并反序列化以供以后使用。我需要一个数据结构来存储对象。
我可以使用结构实现它:
struct person
{
int id;
string name;
int age;
};
并有一个辅助函数来初始化struct:
// Returns a person deserialized from a JSON object
person fromJson(JsonObject obj);
// Usage:
auto personInfo = fromJson(/* JSON object from REST service */);
或者有一个带有getter,setter和构造函数的类,它将JsonObject作为参数并自行进行反序列化:
class person
{
public:
// Deserialized a JSON object and initializes the private fields
person(JsonObject obj);
int id() const;
string name() const;
int age() const;
void setId(int id);
void setName(string name);
void setAge(int age);
private:
int _id;
int _name;
int _age;
};
// Usage:
person personInfo{ /* JSON object from REST service */ };
鉴于数据将存储在客户端计算机上,显示,可能已编辑然后发送回REST服务,哪种实现更适合使用?由于我只使用数据结构来存储数据(使用setter / getters不应该触发除设置/获取值之外的其他任何东西)我无法想到除了个人之外的任何其他好处偏好。
答案 0 :(得分:2)
我会去上课路线。在这种情况下,您正在使用的对象可以执行所有需要执行的操作(没有辅助方法来创建对象),并且清楚且明显地使用了什么。更重要的是,随着您的应用程序变得越来越复杂,它将使您更容易保持对象的结构和功能的逻辑性和实用性。
答案 1 :(得分:2)
在C ++中,struct
和class
之间的唯一区别是默认访问说明符,public
structs
和类private
。您可以拥有struct
成员函数,构造函数,移动分配等,它与class
相同。在构造函数中执行反序列化或具有自由函数完全取决于您。另一种选择是在static
中使用person
成员函数返回person
个对象。
class person {
public:
static person fromJSON(JsonObject const& src) { ... }
};
auto p = person::fromJSON(source);
在任何情况下,您都需要大量的验证代码,因为您传递的是有效的JSON对象,并且一定要遵循3/5/0的规则,这样您就不会意外抑制移动语义。