用于将多态基类的子类数组传递到构造函数中的最简单语法

瑞士人弗兰克

这是工作代码,我想简化它的调用。让我们从调用开始:

Config c2( {
           new ConfigPairInt(  "one",   1   ),
           new ConfigPairDouble( "two",   2.0 ),
           new ConfigPairString( "three", "3" )
} );

我要摆脱的第一件事是new(如果我这样做,new我想那是内存泄漏了吗?)但是,当我使Config的构造函数接受vector<ConfigPair&>并删除这些时new,我得到的错误页面对我来说没有意义。

我想摆脱的第二件事是类型类名称。如果我改用花括号初始化器,那么编译器确实知道braced-initializer列表是ConfigPair*,因此它看到的所有内容都应该是ConfigPair 其子类之一的初始化器但是,编译器实际上是否在搜索子类构造函数?显然不是。(我确实有一个想法,就是让ConfigPair完成其所有子类的工作,并为其提供三个不同的构造函数。它不再是多态的。而且不再是多态的,那么我也可以摆脱这个问题,new因为向量可能属于此类,ConfigPair而不是ConfigPair*由于多态性而需要。但是,多态性似乎完全适合该问题,因此我不愿放弃它。)

我要摆脱的第三件事是vector初始化程序周围的花括号我想我可以使用参数包来做到这一点,但是我无法获得子类参数的结果列表来初始化向量。

class ConfigPair {
public:
  ConfigPair( const char* pszName_in ) :
    pszName( newstring( pszName_in ) )
  {
  };

  virtual ~ConfigPair() {
    free( (char*) pszName );
  };

  const char* pszName;
};



class Config {
public:
 
  Config( std::vector<ConfigPair*> apcpair )
  {
      for( ConfigPair* pcpair: apcpair )
          // do something
  }
};



class ConfigPairInt : public ConfigPair {
public:
  ConfigPairInt( const char* pszName_in, int iValue_in ) :
    ConfigPair( pszName_in ),
    iValue( iValue_in )
  {
  };

  int         iValue;
};



class ConfigPairDouble : public ConfigPair {
public:
  ConfigPairDouble( const char* pszName_in, double dValue_in ) :
    ConfigPair( pszName_in ),
    dValue( dValue_in )
  {
  };
  double      dValue;
};

  

class ConfigPairString : public ConfigPair {
public:
  ConfigPairString( const char* pszName_in, const char* pszValue_in ) :
    ConfigPair( pszName_in ),
    pszValue( newstring( pszValue_in ) )
  {
  };

  virtual ~ConfigPairString() {
    free( (char*) pszValue );
  };

  const char* pszValue;
};
瑞士人弗兰克

AS Remy和Panta在其他答案中指出:如果您想使用多态性,就无法摆脱派生的类型名称,因为编译器需要知道要创建的类型。由于这是呼叫者最打字的方式,因此消除它是优先事项。因此,排除了多态性。

取而代之的是,原来用于不同种类对的虚拟基类现在变成了“瑞士军刀”,能够完成其子类的工作。它具有各种构造函数,并且增加了枚举的开销,该枚举要知道调用了哪个构造函数。

public:
  ConfigPair( const char* pszName_in, int iValue_in ) {
    cfgpair.type    = TypeInt64;
    cfgpair.pszName = newstring( pszName_in );
    cfgpair.u.i     = iValue_in;
  }

  ConfigPair( const char* pszName_in, double dValue_in ) {
    cfgpair.type    = TypeDouble;
    cfgpair.pszName = newstring( pszName_in );
    cfgpair.u.d     = dValue_in;
  }

  ConfigPair( const char* pszName_in, const char* pszValue_in ) {
    cfgpair.type     = TypeSz;
    cfgpair.pszName  = newstring( pszName_in );
    cfgpair.pszValue = newstring( pszValue_in );
  }

既然这ConfigPair是传递给Config构造函数的唯一类,则意味着编译器对构造函数的类型要求的了解使其可以在调用时推断出对象类型。因此,省去了类名。

此外,由于阵列内容现在是同质的,我们可以把ConfigPair的自己变成阵列,而不是(如最初需要)仅存储指针ConfigPair子类对象。因此,是新的(或替代性的和非内存泄漏的,但更冗长的shared_pointer<ConfigPairXXX>()表示法)。

  Config( const char* pszName_in, // name only used for debugging messages
          std::vector<ConfigPair> acpair ) :
      Config( pszName_in )
  {
      for ( const ConfigPair cpair: acpair )
          cpair.Set( this );
  }

对于呼叫者:

Config c2( { { "one",   1   },
             { "two",   2.0 },
             { "three", "3" } } );

最后,将大括号括起来的初始化列表留在了外面。我探索了用参数包替换向量的方法,但是后来我不知道如何使编译器再知道类型了,因此再次需要该类型。要继续进行此操作,就调用方的简单性而言,将向前退了十步,因此我毕竟坚持使用braced-initializer-list。(如果还有其他替代方法可以在不需要类名的情况下摆脱这些大括号,请让我知道。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用于将多态基类的子类数组传递到构造函数中的最简单语法

来自分类Dev

使用CRTP将基类的子类传递给构造函数?

来自分类Dev

从另一个类的构造函数将数组传递到类函数中

来自分类Dev

将参数传递给超类构造函数,而不必在子类构造函数中重复

来自分类Dev

将构造函数值从子类传递到超类 C++

来自分类Dev

传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

来自分类Dev

如何停止在子类中调用基类的构造函数

来自分类Dev

在基类构造函数中获取子类的名称

来自分类Dev

将继承的参数传递给基类构造函数,然后在派生类构造函数中执行某些操作

来自分类Dev

将数组作为类构造函数的函数参数传递

来自分类Dev

将数组作为类构造函数的函数参数传递

来自分类Dev

用于将类传递给函数的Scala语法

来自分类Dev

将参数传递给基类构造函数C ++

来自分类Dev

将构造函数参数传递给Nunit基类

来自分类Dev

将私有变量传递给基类构造函数

来自分类Dev

用于val函数中多态的Scala语法

来自分类Dev

从子类的构造函数体中调用基类的构造函数

来自分类Dev

使用基类构造函数的子类构造函数的轮廓定义

来自分类Dev

将泛型传递到类构造函数列表

来自分类Dev

如何在多态函数中传递父类实例代替子类实例?

来自分类Dev

将超类传递到需要子类的方法中

来自分类Dev

如何将数组传递给构造函数并保存在类变量中

来自分类Dev

以简单的方式将多个参数从数组传递到函数

来自分类Dev

以简单的方式将多个参数从数组传递到函数

来自分类Dev

我可以将属于类数组的子类或属于该类数组的子组件传递给C ++中的函数吗?

来自分类Dev

将闭包捕获构造函数参数传递给基类构造函数

来自分类Dev

将超类对象作为参数传递给子类构造函数(java)

来自分类Dev

如何将超类对象传递给子类构造函数?

来自分类Dev

其基类的传递构造函数

Related 相关文章

  1. 1

    用于将多态基类的子类数组传递到构造函数中的最简单语法

  2. 2

    使用CRTP将基类的子类传递给构造函数?

  3. 3

    从另一个类的构造函数将数组传递到类函数中

  4. 4

    将参数传递给超类构造函数,而不必在子类构造函数中重复

  5. 5

    将构造函数值从子类传递到超类 C++

  6. 6

    传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

  7. 7

    如何停止在子类中调用基类的构造函数

  8. 8

    在基类构造函数中获取子类的名称

  9. 9

    将继承的参数传递给基类构造函数,然后在派生类构造函数中执行某些操作

  10. 10

    将数组作为类构造函数的函数参数传递

  11. 11

    将数组作为类构造函数的函数参数传递

  12. 12

    用于将类传递给函数的Scala语法

  13. 13

    将参数传递给基类构造函数C ++

  14. 14

    将构造函数参数传递给Nunit基类

  15. 15

    将私有变量传递给基类构造函数

  16. 16

    用于val函数中多态的Scala语法

  17. 17

    从子类的构造函数体中调用基类的构造函数

  18. 18

    使用基类构造函数的子类构造函数的轮廓定义

  19. 19

    将泛型传递到类构造函数列表

  20. 20

    如何在多态函数中传递父类实例代替子类实例?

  21. 21

    将超类传递到需要子类的方法中

  22. 22

    如何将数组传递给构造函数并保存在类变量中

  23. 23

    以简单的方式将多个参数从数组传递到函数

  24. 24

    以简单的方式将多个参数从数组传递到函数

  25. 25

    我可以将属于类数组的子类或属于该类数组的子组件传递给C ++中的函数吗?

  26. 26

    将闭包捕获构造函数参数传递给基类构造函数

  27. 27

    将超类对象作为参数传递给子类构造函数(java)

  28. 28

    如何将超类对象传递给子类构造函数?

  29. 29

    其基类的传递构造函数

热门标签

归档