首页 > 解决方案 > 如何在 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++ 中构建对象图。这有很多合理的原因和应用,例如设计域模型等。所以是的,谢谢你的意思。

标签: javac++getter-setter

解决方案


首先,你把不同的东西混为一谈。我将暂时忽略 getter 和 setter 的部分......

//地址作为指针?参考?价值?shared_ptr?

如果你想要 astd::string那么你使用 a std::string。如果你想要一个,Adress那么你使用一个Adress. 如果你想要一个值,那么你就使用一个值。你的代码中没有任何迹象表明你需要其他任何东西。大多数生命周期都是在 C++ 中自动管理的(并且与 Java 相比是确定性的)。

我不是很确定,但我想一个很好的替代品ArrayListstd::vector. 但是,不要将它们混淆为相同甚至相似。AnArrayList<whatever>包含 Java Objects,而 astd::vector<std::string>包含 acutal std::strings。价值观。

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 。


推荐阅读