簡體   English   中英

C++中如何定義類圖(字段類型、getters和setters)

[英]How to define an graph of classes in C++ (field types, getters and setters)

我試圖找出關於如何在 C++ 中為表示獨立實體並形成對象圖或網絡的類編寫字段以及 getter 和 setter 方法的正確方法。

為簡單起見,假設我們要在 Java 中編寫以下 class 中的等效代碼 C++。

public class Person {

    private String name; // 1
    private Address address; // 2
    private List<Account> accounts = new ArrayList<>(); // 3

    // 1
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    // 2
    public Address getAddress() { return address; }
    private void setAddress(Address address) { this.address = address; }

    // 3
    public List<Account> getAccounts() { return accounts; }
}

class Address { ... }
class Account { ... }

如您所見,我選擇了標准 String 類型和 2 個自定義類作為成員字段。 那是因為它們是復雜類型。 除了名稱字段外,還選擇了其他 2 個字段來演示典型的多對一關系(個人地址)和一對多關系(個人帳戶)。

另外 C++ (std:string) 中的 String 類型是 RAII 類型。 它通常以字面方式使用,因為它封裝了對堆中實際值的管理。

現在,我不清楚每個字段的正確類型定義是什么,以及如何使用 getter 和 setter 公開它們,同時保持每個對象的生命周期,在 C++ 中,如上面的 Java 示例。

class Person {

    std::string _name;
    // address as pointer? reference? value? shared_ptr?
    // the same as above for the collection of accounts

    public:
    // appropriate getters, setters ?
}

注 1:我對諸如“你為什么要這樣做?”之類的回答不感興趣。 或“你為什么要這樣做?”。 問題的重點是清楚地了解我們如何在 C++ 中構建對象圖。這有很多合理的理由和應用,例如設計域 model 等。所以是的,謝謝你直截了當.

首先,您將不同的事物混為一談。 我會暫時忽略 getters 和 setters 的部分......

//地址作為指針? 參考? 價值? 共享指針?

如果你想要一個std::string那么你使用std::string 如果你想要一個Adress那么你使用一個Adress 如果你想要一個值,那么你就使用一個值。你的代碼中沒有任何跡象表明你還需要任何其他東西。 大多數生命周期在 C++ 中自動管理(並且與 Java 相比是確定性的)。

我不是很確定,但我想ArrayList的一個很好的替代品是std::vector 但是,不要將它們混淆為相同甚至相似。 ArrayList<whatever>包含 Java Object s,而std::vector<std::string>確實包含實際的std::string s。 價值觀。

struct Adress {
    std::string city;
};
struct Account {
    std::string password;
};

struct Person { 
    std::string _name;
    Adress adress;
    std::vector<Account> accounts;
};

這就是正確管理對象生命周期所需的全部內容。 自動調用析構函數。

要將參數傳遞給 setter 並從 getter 返回值,您可以查看C++ 核心指南 然而,指南的這一部分可能有點讓人不知所措,基本上您可以在此處找到開始使用 getter 和 setter 所需的全部知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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