是否有任何方法可以分解" const" C ++中的字段初始值设定项

时间:2017-12-05 17:51:25

标签: c++

在C ++中,我有一个带有一些const字段的类:

class Obj {
   static const AType defaultAType; 
   const AType &cRef;
public: 
   Obj() : cRef(defaultAType) { ... }
   Obj(AType &aType) : cRef(aType) { ... }
};

这是一个简单的例子。但真正的一个可能有许多字段,以及几个不同的构造函数重载。参考文献和" const"在我所知的情况下,不能在构造函数的主体或构造函数调用的方法中初始化字段。但是,同步维护一些初始化器是一种痛苦,比如5个单独的构造函数重载。有没有办法正确分解这些初始化器(宏除了)??

3 个答案:

答案 0 :(得分:3)

在评论中,你说,

  

是的,这是结构,但是const项,引用和类项不能在构造函数体中或非构造函数方法中初始化。

delegating constructor可用于初始化引用成员变量。

稍微扩展您的示例代码,我可以看到类似的内容:

class Obj {
   static const AType defaultAType; 
   const AType &aRef;
   static const BType defaultBType; 
   const BType &bRef;
public: 

   // Delegate with default values for both references
   Obj() : Obj(defaultAType, defaultBType) {}

   // Delegate with default value for the B reference
   Obj(AType &aType) : Obj(aType, defaultBType) {}

   // Delegate with default value for the A reference
   Obj(BType &bType) : Obj(defaultAType, bType) {}

   // A constructor that has all the arguments.
   Obj(AType& aType, BType& bType) : aRef(aType), bRef(bType) {}
};

答案 1 :(得分:0)

所以这是一个限制,你不能在构造函数之外初始化const变量,所以我脑子里有一种方法。你可以有一个重载的构造函数,其中所有可能的变量类型都作为参数,最后一个参数是整数,表示在每次重载时考虑一个变量时需要注意的参数。所以你可以做这样的事情。希望这个有所帮助。您可以增加要初始化的变量数。

请注意只是将null传递给未考虑的引用。



class Obj {
  const typea var1;
  const typeb var2;
  const typec var3;
  const typed var4;

  public Obj(typea * ptr1, typeb * ptr2, typec * ptr3, typed * ptr4, int index) {

    switch (index) {

      case 1:
        var1 = * ptr1;
        break;
      case 2:
        var2 = * ptr2;
        break;
      case 3:
        var3 = * ptr3;
        break;
      case 4:
        var4 = * ptr4;
        break;
    }

  }

}




答案 2 :(得分:0)

没有。除非你使用C ++ 11,否则你可以在类定义中初始化其中的一些:

struct B
{
    B(int) {}
    constexpr B(double) {}
};

class A
{
    const B b1 = 1;
    static constexpr B b2 = 2.0;
};

对于从构造函数输入参数构造的const值,您需要使用initializer list