簡體   English   中英

實施模型,結構與類

[英]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 ++中, structclass之間的唯一區別是默認訪問說明符,該默認訪問說明符對structspublic ,對於類是private的。 您可以使用帶有成員函數,構造函數,移動分配等的struct ,該structclass相同。 在構造函數中進行反序列化或具有自由功能完全取決於您。 另一種選擇是有一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM