是否可以有一个带有 1 个未声明类型的输入参数的构造函数?

Posted

技术标签:

【中文标题】是否可以有一个带有 1 个未声明类型的输入参数的构造函数?【英文标题】:Is it possible to have a constructor with 1 input parameter of undeclared type? 【发布时间】:2021-12-28 19:06:15 【问题描述】:

这是我想要做的:

    具有两个对象的类(string myStrint myInt

    构造函数接受1个参数(数据类型不固定)。

    If参数为字符串:myStr = parameter; myInt = parameter.length();

    If 参数为整数:myInt = parameter; myStr = "0000...0" (长度为“参数”的字符串,由for循环设置)

    Else : cout << "Error";

是否可以按照我在第 2 行中描述的操作?

我已经设法仅使用字符串和转换数据类型(在为 myStr 的长度施加人为下限时能够做到这一点)做一些变通办法,但这会导致我进一步的其他问题。

【问题讨论】:

听起来你在问函数重载。您可以只提供两个构造函数,一个采用int,另一个采用std::string,并根据需要实现它们。 你知道你可以定义多个构造函数吗? 关于5.:你不应该为此做任何运行时输出。如果您尝试使用不受支持的构造函数参数类型来构造类实例,即,如果您没有为该类型编写构造函数,编译器将简单地使编译失败并显示错误消息,这比仅在运行时。 当然可以使用模板构造函数,它似乎能够满足这些要求,但是与为选项 3. 到 5. 定义 3 个重载相比,生成的代码只是不必要地复杂,此外还允许你会导致编译时错误而不是运行时错误 5.... 【参考方案1】:

是否可以有一个带有 1 个未声明类型的输入参数的构造函数?

从技术上讲,您可以使用可变参数,它允许未指定数量的未指定类型的参数。但我建议不要使用它。

必须声明所有其他参数的类型。

如果参数是字符串:myStr = parameter; myInt = parameter.length();

如果参数是 int: myInt = parameter; myStr = "0000...0"(长度为“参数”的字符串,由for循环设置)

您可以使用两个构造函数而不是一个构造函数轻松实现此目的。一个接受字符串,另一个接受整数。

【讨论】:

【参考方案2】:

问题不是使用单个参数,而是您需要稍后找出参数的数据类型。

一个常用的技巧是使用通用指针,或通用对象类引用或指针。

MyClass::MyClass ( void* P );
MyClass::MyClass ( SomeBaseClass& P);

由于您正在处理更简单的数据,您可能想尝试 O.O.方法比如将值嵌套在对象中,然后检查数据的类型:

class BaseClass

  // ...
 ;

class IntegerClass: BaseClass

  int Value;
 ;

class StringClass: BaseClass

  String Value;
 ;

您的班级可以接收“BaseClass”对象引用:

class MyClass

  private int MyInt;
  private String MyString;
  
  MyClass ( BaseClass& P ) 
  
     if ( P is IntegerClass )
     
       // 
     
     else if ( P is StringClass )
     
       //
     
  
 ;

int main (...)

  IntegerClass *i = new IntegerClass(5);
  StringClass *s = new StringClass ("Hello");
  
  MyClass *O1 = new MyClass(i);
  MyClass *O2 = new MyClass(s);
  
  // Display values of O1 and O2 here
  
  free O2;
  free O1;
   
  free s;
  free i;
  
  return 0;

就我的两个比特币...

【讨论】:

@user17732522 在我的代码示例中没有使用void& 这样的东西...

以上是关于是否可以有一个带有 1 个未声明类型的输入参数的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ElasticSearch 的嵌套树的构面

是否可以发布带有环境模块声明的包?

写出java中定义方法的语法格式,并说明一个方法可以有多少个参数,多少个返回值?

是否可以将接口的参数类型留给在 Go 中实现它的接收器?

条件参数和返回类型声明(又名类型提示)

ProGuard 警告:对程序类成员有 7 个未解决的引用