是否可以有一个带有 1 个未声明类型的输入参数的构造函数?
Posted
技术标签:
【中文标题】是否可以有一个带有 1 个未声明类型的输入参数的构造函数?【英文标题】:Is it possible to have a constructor with 1 input parameter of undeclared type? 【发布时间】:2021-12-28 19:06:15 【问题描述】:这是我想要做的:
具有两个对象的类(string myStr
和 int 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 个未声明类型的输入参数的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章