我正在试图找到一种正确的方法,在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个自定义类作为成员字段。这是因为它们是复杂的类型。除了name字段外,还选择了其他两个字段来演示典型的多对一关系(person address)和一对多关系(person accounts)。
此外,c++中的字符串类型(std:string)是raii类型。它通常以文本的方式使用,因为它将其实际值的管理封装在堆中。
现在,我还不清楚每个字段的正确类型定义是什么,以及如何用getter和setter公开它们,同时保持每个对象的生命周期,如上面的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++中构建一个对象图。这有很多合理的理由和应用,比如设计一个域模型,等等。所以是的,谢谢你这么说。
1条答案
按热度按时间643ylb081#
首先,你把不同的东西混为一谈。我会暂时忽略这一部分。。。
//地址作为指针?参考号?价值?共享\u ptr?
如果你想要一个
std::string
然后你用一个std::string
. 如果你想要一个Adress
然后你用一个Adress
. 如果您想要一个值,那么您就使用一个值。在您的代码中没有指示您需要其他任何东西。大多数生命周期在c++中是自动管理的(与java相比是决定性的)。我不是很确定,但我想这是一个很好的替代品
ArrayList
是一个std::vector
. 但是,不要混淆它们是相同的甚至相似的。一ArrayList<whatever>
包含javaObject
有段时间了std::vector<std::string>
是否包含acutalstd::string
s。价值观。这就是正确管理对象生命周期所需的全部内容。析构函数是自动调用的。
要将参数传递给setter并从getter返回值,可以查看c++核心指南。然而,这一部分的指导方针可能是有点压倒性的,基本上所有你需要知道开始与getter和setter你可以在这里找到。