C++:如何将变量作为参数传递给类构造函数
Posted
技术标签:
【中文标题】C++:如何将变量作为参数传递给类构造函数【英文标题】:C++: how to pass a variable as an argument to class constructor 【发布时间】:2013-08-10 03:38:36 【问题描述】:我面临一个非常令人费解的问题。我正在尝试使用变量作为参数来构造对象。
请看一下这段代码:
#include <iostream>
class A
public:
A() : val(0) ;
A(int v) : val(v) ;
private:
int val;
;
main()
int number;
A a; /* GOOD, object of type A, created without arguments */
A b(2); /* GOOD, object of type A, created with one argument */
A c(); /* BAD, C++ thinks this is declaration of
a function returning class A as a type */
A(d); /* GOOD, object of type A again; no arguments */
A(number); /* BAD, tries to re-declare "number" as object of type A */
我想我明白为什么可以创建对象“a”、“b”和“d”,而不能创建其他对象。
但我真的需要最后一个声明的语法,即
A(number);
创建一个临时对象,作为参数传递给另一个对象。
知道如何解决它吗?
Kind regards
【问题讨论】:
(A(number));
或 static_cast<A>(number);
还有更多here。
ideone.com/QbTf1t
酷,谢谢!所以,我需要: A( (int)number );解决它?
【参考方案1】:
您的意图是创建一个临时对象,但此对象将也是匿名:您无法在分号后引用它。 创建匿名临时对象只是为了丢弃它是没有意义的。您必须直接在将使用它的 ctor/方法的调用站点实例化您的临时对象。
解决方案
要将匿名临时对象传递给函数,您实际上需要在参数列表中实例化它:
functionExpectingA(A(number));
对于“c 声明”这一行,您正在戳most vexing parse。如果您确实需要将默认构造的 A
对象作为参数传递给另一个对象构造函数,则需要添加另一对大括号来完成此操作(以便编译器将其与函数声明区分开来):
class OtherClass
public:
OtherClass(A a)
//...
;
;
OtherClass obj((A()));
^ ^
EDIT #1 : jrok 指出给 A 构造函数的参数不足以解决歧义。
如果你需要传递一个用参数构建的匿名临时对象,没有歧义(所以不需要额外的括号),你仍然需要围绕匿名对象构造的括号.:
OtherClass obj((A(number)));
C 遗产:单个参数是不够的
EDIT #2:“为什么给构造函数一个 single 参数不能解决歧义”。
OtherClass obj(A(number));
会发生什么?
这是一个名为obj
的函数的声明,将A
对象作为其唯一参数。此参数名为 number。
即:它完全等同于OtherClass obj(A number);
。当然,您可以在函数声明时省略参数名称。所以它在语义上也等同于OtherClass obj(A);
The syntax with parentheses around the object name is inherited from C:
int(a); // declares (and defines) a as an int.
int a; // strictly equivalent.
那么构造函数的参数更多呢?
如果您向 OtherClass
添加了一个带有两个(或更多)参数的 ctor:
OtherClass(A a1, A a2)
//...
;
那么这个语法:
A arg1, arg2;
OtherClass obj(A(arg1, arg2));
这一次是否会将obj
声明为OtherClass
的实例。
这是因为A(arg1, arg2)
不能解释为A
的名称声明。所以它实际上被解析为一个匿名A
对象的构造,使用带有2个参数的构造函数。
【讨论】:
最后一段写错了。OtherClass obj(A(number));
也是一个函数声明。
@jrok:谢谢你接听!以上是关于C++:如何将变量作为参数传递给类构造函数的主要内容,如果未能解决你的问题,请参考以下文章
当我将参数传递给类构造函数时,是否需要其他名称相同或自已的函数可用?