[英]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.