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

这是我想要做的:

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

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

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

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

  5. Else : cout << "Error";

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

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

【问题讨论】:

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

标签: c++ types constructor


【解决方案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& 这样的东西...
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多