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&lt;A&gt;(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++:如何将变量作为参数传递给类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

C++ 将列表作为参数传递给函数

C ++,将对象作为参数传递给另一个对象构造函数

当我将参数传递给类构造函数时,是否需要其他名称相同或自已的函数可用?

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

我如何将参数传递给构造函数? [关闭]