【问题标题】:is there a way to initialize members in brace?有没有办法初始化大括号中的成员?
【发布时间】:2017-06-02 17:11:08
【问题描述】:

我有一个定义了一些成员的类 DealSchedule,现在我必须用类似的东西来初始化它:

DealSchedule trf_schedule;
trf_schedule.site_ = site;
trf_schedule.deal_id_ = deal_id;
trf_schedule.payment_date_ = payment_date;
trf_schedule.ccy1_ = ccy1;
trf_schedule.ccy2_ = ccy2;

有没有可能写得很好

DealSchedule trf_schedule 
{ 
  site_ = site;
  deal_id_ = deal_id;
  payment_date_ = payment_date;
  ccy1_ = ccy1;
  ccy2_ = ccy2;
};

这将保护对初始化的更改。

我可以做出这样的事情(需要 c++14 支持在 lambda 捕获中重命名):

DealSchedule trf_schedule;
[&_=trf_schedule]()
{
  _.site_ = site;
  _.deal_id_ = deal_id;
  _.payment_date_ = payment_date;
  _.ccy1_ = ccy1;
  _.ccy2_ = ccy2;
}();

【问题讨论】:

  • 你只有5个成员要初始化,为什么不让它成为构造函数的一部分呢?所以你可以这样称呼它trf_schedule = { site, deal_id, payment_date, ccy1, ccy2 };
  • 试图避免随着成员列表的增长而更新构造函数。 @Fireboyd78
  • 啊,我明白了。不幸的是,在 C++ 中并没有真正的方法可以按照您想要的方式进行操作,最好的办法是使用构造函数重载。
  • 先做你的设计,这将减少“随着成员列表的增长”的努力
  • 您可以利用聚合初始化。 What is Aggregate Initialization?点击链接,看看聚合初始化是否适合你!

标签: c++ initialization


【解决方案1】:

正确的答案是 R_Sahu 的,但如果你真的想要那种语法并且感觉自毁...

struct _ : public DealSchedule { _() { 
  site_ = site;
  deal_id_ = deal_id;
  payment_date_ = payment_date;
  ccy1_ = ccy1;
  ccy2_ = ccy2;
}} trf_schedule;

这使用内联结构进行初始化,然后您可以将其切回到DealSchedule

(实际上不要这样做)

【讨论】:

  • 感觉自我毁灭很高兴看到一些轻松的内容:)
【解决方案2】:
DealSchedule trf_schedule 
{ 
  site_ = site;
  deal_id_ = deal_id;
  payment_date_ = payment_date;
  ccy1_ = ccy1;
  ccy2_ = ccy2;
};

不是用于初始化对象的有效 C++ 语法。您可以使用

初始化对象
DealSchedule trf_schedule = {site, deal_id, payment_date, ccy1, ccy2};

如果

  1. 相应的成员是public(在您的情况下听起来是这样)并且没有提供其他显式或用户定义的构造函数,或者
  2. 有一个构造函数接受这些参数。

【讨论】:

  • 1. [...] 并且没有提供其他显式或用户定义的构造函数
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多