java - 如何在 C++ 中定义类图(字段类型、getter 和 setter)
问题描述
我试图找出正确的方法,如何在 C++ 中为表示独立实体并形成对象图或网络的类编写字段以及 getter 和 setter 方法。
保持简单,假设我们想用 C++ 编写 Java 中以下类的等效代码。
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 { ... }
如您所见,我选择了标准字符串类型和 2 个自定义类作为成员字段。那是因为它们是复杂类型。除了名称字段,选择其他 2 个字段来演示典型的多对一关系(个人地址)和一对多关系(个人帐户)。
此外,C++ 中的 String 类型(std: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++ 中构建对象图。这有很多合理的原因和应用,例如设计域模型等。所以是的,谢谢你的意思。
解决方案
首先,你把不同的东西混为一谈。我将暂时忽略 getter 和 setter 的部分......
//地址作为指针?参考?价值?shared_ptr?
如果你想要 astd::string
那么你使用 a std::string
。如果你想要一个,Adress
那么你使用一个Adress
. 如果你想要一个值,那么你就使用一个值。你的代码中没有任何迹象表明你需要其他任何东西。大多数生命周期都是在 C++ 中自动管理的(并且与 Java 相比是确定性的)。
我不是很确定,但我想一个很好的替代品ArrayList
是std::vector
. 但是,不要将它们混淆为相同甚至相似。AnArrayList<whatever>
包含 Java Object
s,而 astd::vector<std::string>
包含 acutal 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++ coreguidelines。但是,指南的那部分内容可能有点让人不知所措,基本上您需要知道的所有内容,才能开始使用您可以在此处找到的 getter 和 setter 。
推荐阅读
- google-cloud-platform - Spark-BigTable - HBase 客户端未在 Pyspark 中关闭?
- java - Spring Kafka 限制一个时间段内要消费的消息数
- reactjs - Formik 禁用提交 btn
- java - 如何在java中过滤泛型值数组并使其返回泛型数组?
- scenekit - 当 alpha 设置为 0 时,SCNPlane 上的奇数边界线
- python-3.x - Keras model.predict - 预期 ndim=3,发现 ndim=2
- javascript - 错误:无法读取未定义的属性“nota”。(Javascript)
- c++ - 将矢量数据复制到具有不同元素数据类型的元组的好做法是什么?
- image - 如何从图库中选择图像并保存到 xamarin 中的 sql 数据库
- python - 如何在 python turtle 中创建一次性按钮?