【问题标题】:An object as an attribute C++对象作为属性 C++
【发布时间】:2021-05-08 09:37:03
【问题描述】:

我有两节课。 如您所见,第一个类的实例是第二个类的属性。当我尝试创建第二个类的实例时,它会在第二个类的构造函数之前调用第一个类的构造函数。有什么办法可以预防吗?

class Date {
    int jour;
    int mois;
    int annee;

public:
    Date();
    Date(int, int, int);
};
class personne {
protected:
    string nom;
    string prenom;
    string CIN;
    Date date_de_naissance;

public:
    personne();
    personne(string, string, string, Date);
    
};

【问题讨论】:

  • initialization order 在 C++ 规范中是固定的。
  • 这个XY problem 太过分了。为什么你认为你需要改变初始化顺序?这应该解决什么问题?
  • 我正要添加一个答案,但重新阅读后,我不确定我是否理解了这个问题,但我仍然把这个作为评论:你可以调用 Date 的复制构造函数在 personne 的构造函数中: personne(string n, string pn, string cin, Date date) : nom(n), prenom(pn), CIN(cin), date_de_naissance(date) {}
  • 没有。类的成员在包含类构造函数的主体开始之前被初始化(包括调用它们的构造函数,如果他们有的话)。您可以使用构造函数初始化程序列表更改成员的初始化方式(但不是初始化顺序)。
  • 您可以反转事物并将personne 放入Date 中。更重要的是,澄清你到底为什么要在组件之前构建一些东西?

标签: c++ object


【解决方案1】:

我找到了一种解决方法,我可以在开始时设置一个默认值,然后稍后在第二个类的构造函数中重置该属性的值。

【讨论】:

  • 这实际上不是 "workaround",而是它的预期行为方式,如果您需要 Date 中的特殊默认值,请将它们设置为 Date 的默认值构造函数。
  • 这不会“解决”问题中描述的“问题”。我建议你先澄清这个问题。为什么你认为先调用成员的构造函数是一个问题?当您初始化它时也会发生这种情况,因此不清楚这个答案可以防止或解决什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2011-01-29
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
相关资源
最近更新 更多