问题描述
我正在尝试为代表独立实体并形成对象图或网络的类找到一种正确的方法,该方法用于在C ++中编写字段以及getter和setter方法。
让事情变得简单,让我们说我们要用Java用下面的类的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个自定义类作为成员字段。那是因为它们是复杂的类型。除了名称字段外,还选择了其他两个字段来演示典型的多对一关系(人称-地址)和一对多关系(人-帐户)。
此外,C ++中的String类型(std:string)是RAII类型。它通常以字面方式使用,因为它将实际值的管理封装在堆中。
现在,对于我来说,尚不清楚对于每个字段来说正确的类型定义是什么,以及如何在C ++中像上面的Java示例一样,在保持每个对象的生命周期的同时,如何使用getter和setter公开它们,
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 ++中构建对象图的清晰理解。这样做有很多合理的理由和应用,例如设计域模型等。因此,是的,谢谢您发臭的观点。
解决方法
首先,您正在混淆不同的事物。我会暂时忽略吸气剂和吸气剂的一部分...
//地址作为指针?参考?值? shared_ptr?
如果您想使用std::string
,则可以使用std::string
。如果您想要Adress
,则可以使用Adress
。如果您需要一个值,则使用一个值。代码中没有指示您需要其他任何内容。大多数生命周期都是使用C ++自动控制的(确定性地与Java相对)。
我不确定,但我想ArrayList
可以很好地代替std::vector
。但是,不要混淆它们相同或相似。 ArrayList<whatever>
包含Java Object
,而std::vector<std::string>
包含附加std::string
。值。
struct Adress {
std::string city;
};
struct Account {
std::string password;
};
struct Person {
std::string _name;
Adress adress;
std::vector<Account> accounts;
};
这是正确管理对象生命周期所需的全部。析构函数会自动调用。
要将参数传递给setter并从getter返回值,可以查看C++ coreguidelines。但是,指南的那部分内容可能有点让人不知所措,从根本上讲,您需要了解的所有知识here都可以开始使用getter和setter。