具有聚合初始化的C ++ 11构造函数委派

时间:2016-06-02 13:22:16

标签: c++ c++11 constructor aggregate-initialization delegating-constructor

是否可以在我自己的默认ctor定义中调用聚合初始化?

GCC抱怨"错误:构造函数委托自己"使用以下代码:

appUsageStats.get(appInformation.packageName).getLastTimeUsed()

我目前在ctor机构中使用Map<String, UsageStats> appUsageStats appUsageStats = UStats.getMapOfAggregatedUsage(MainActivity.this); if(appUsageStats.get(appInformation.packageName)!=null) { long used = appUsageStats.get(appInformation.packageName).getLastTimeUsed(); long installedDiff2 = new Date().getTime() - new Date(used).getTime(); long daysGap = TimeUnit.DAYS.convert(installedDiff2, TimeUnit.MILLISECONDS); if(daysGap==0) { appInfoObj.setAppUsedDate("Used : Today"); }else{ appInfoObj.setAppUsedDate("Used : " + String.valueOf(daysGap) + " days ago"); } appInfoObj.setAppUsedDateNumber(daysGap); }

3 个答案:

答案 0 :(得分:1)

一种方法是以下列方式欺骗重载决策:

AttributeError: 'Series' object has no attribute 'df'

另一种方法是使用类内默认成员初始化:

struct X {
  int x, y, z, p, q, r;
  X(int) : x{}, y{}, z{}, p{}, q{}, r{} { }
  X() : X(0) { }
};

在您的具体示例中,您也可以这样做:

struct X {
  int x = 0, y = 0, z = 0, p = 0, q = 0, r = 0;
};

答案 1 :(得分:0)

您可以使用CRTP执行此操作。

reduce

但我不保证这是安全的。

答案 2 :(得分:0)

使用factory pattern - 将构造函数的主体移动到单独的类:

struct X {
  int x, y, z, p, q, r;
};

struct XFactory {
  X create();
};

X XFactory::create()
{
   X x{};
   // do needed modification
   return x;
}

虽然我总是喜欢工厂模式 - 还有其他方式更符合您的显式需求 - 为每个成员数据定义默认构造函数:

template <typename T>
struct DefaultConstructibleData
{
   T data;
   DefaultConstructibleData() data{} {} 
};

并使用它:

struct X {
  DefaultConstructibleData<int> x, y, z, p, q, r;
  X() 
  {         
       // do whatever you needs to do
       // all x,y,... are already constructed to their defaults
  }
};