[英]Implementing models, struct vs. class
假設我有一個REST服務,它使用以下方案返回JSON對象:
{
"id" : 1
"name" : "Peter"
"age" : 25
}
我有一個用C ++編寫的應用程序,該應用程序接收此對象並反序列化以供以后使用。 我需要一個數據結構來存儲對象。
我可以使用任何一種結構來實現:
struct person
{
int id;
string name;
int age;
};
並具有幫助函數來初始化結構:
// Returns a person deserialized from a JSON object
person fromJson(JsonObject obj);
// Usage:
auto personInfo = fromJson(/* JSON object from REST service */);
或者有一個帶有getters,setters和構造函數的類,該構造函數將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服務,那么哪種實現更適合使用? 由於我只會使用數據結構來存儲數據(使用設置器/獲取器除了設置/獲取值外,不會觸發其他任何事情),除了個人喜好之外,我真的無法想到一個人相對於另一個人的任何好處。
我會去上課路線。 在這種情況下,您正在使用的對象可以完成所有需要做的事情(無需使用輔助方法即可創建該對象),並且正在使用的對象很明顯。 而且,隨着您的應用程序變得越來越復雜,它將使保持對象的結構和功能的邏輯性和實用性變得更加容易。
在C ++中, struct
和class
之間的唯一區別是默認訪問說明符,該默認訪問說明符對structs
是public
,對於類是private
的。 您可以使用帶有成員函數,構造函數,移動分配等的struct
,該struct
與class
相同。 在構造函數中進行反序列化或具有自由功能完全取決於您。 另一種選擇是有一個static
的成員函數person
返回一個person
對象。
class person {
public:
static person fromJSON(JsonObject const& src) { ... }
};
auto p = person::fromJSON(source);
無論如何,您都將需要大量驗證代碼,因為您傳遞的可能是有效的任意JSON對象,並且請務必遵循3/5/0的規則,這樣就不會意外抑制移動語義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.