[英]C++: how to pass a variable as an argument to class constructor
我面临一个非常令人困惑的问题。 我正在尝试使用变量作为参数构造对象。
请看下面的代码:
#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
你的目的是建立一个临时的对象,但这个对象也将是匿名的 :你有没有办法来引用它的分号后面。 创建匿名临时对象仅仅是为了丢弃它是没有意义的。 您必须直接在将使用它的ctor /方法的调用站点上实例化您的临时文件。
要将匿名临时对象传递给函数,实际上您需要在参数列表中实例化它:
functionExpectingA(A(number));
对于“ c声明”行,您正在戳最烦人的分析 。 如果您实际上需要将默认构造的A
对象作为参数传递给另一个对象构造函数,则需要添加另一对花括号来完成技巧(以便编译器可以将其与函数声明区分开):
class OtherClass
{
public:
OtherClass(A a)
{
//...
};
};
OtherClass obj((A()));
^ ^
编辑#1 : jrok指出,给A构造函数的参数不足以解决歧义。
如果您需要传递使用参数构建的匿名临时对象,则
不会产生歧义(因此不需要多余的括号)
,您仍然需要在匿名对象构造周围加上括号。
OtherClass obj((A(number)));
编辑#2:“为什么给一个参数的构造方法不能解决模糊”。
OtherClass obj(A(number));
会发生什么? ?
这是一个名为obj
的函数的声明,将A
对象作为其唯一参数。 此参数名为数字。
即:它完全等效于OtherClass obj(A number);
。 当然,您可以在函数声明中省略参数名称。 因此,它在名义上也等效于OtherClass obj(A);
int(a); // declares (and defines) a as an int.
int a; // strictly equivalent.
如果将ctor添加到OtherClass
两个(或更多)参数的OtherClass
:
OtherClass(A a1, A a2)
{
//...
};
然后这个语法:
A arg1, arg2;
OtherClass obj(A(arg1, arg2));
这次是否实际将obj
声明为OtherClass
的实例。
这是因为A(arg1, arg2)
不能解释为A
名称声明。 因此,实际上使用带有2个参数的构造函数将其解析为匿名A
对象的构造。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.