在对另一个构造函数的调用中调用构造函数
Call constructor inside a call to another constructor
假设我有 类 A, B:
class A
{
int a;
public:
A(int a) : a(a) { }
};
class B
{
A a;
public:
B(A a) : a(a) { }
};
我想创建一个 B 的实例:
int i = 1;
B b(A(i));
但是当我实际尝试使用 b 时,我遇到了描述的问题 here。也就是说,b 不是 B 的实例,它是 returns B 类型对象的函数。但是,它与链接问题的情况不同,我不明白为什么会发生在这里。
我可以将 B 创建为:
int i = 1;
A a(i);
B b(a);
甚至是:
B b(A(1));
它会奏效的。但是,在实际情况下,第一个选项需要太多行,而第二个选项需要很长的行(因为我有一个需要构造的对象而不是 int,而且我有一些对象链)。如何在自己的行创建int,然后在同一行创建A和B?
排除任何可能的函数声明的一个明显方法是:
B b { A {i} };
问题是B b(A(i));
是一个函数声明,而不是B
类型的变量b
的声明。
这就是所谓的most vexing parse。特别是声明:
B b(A(i)); //this is a declaration for a function named `b` that takes parameter of type A and has no return type
以上是一个名为 b
的函数的 声明 ,该函数接受一个类型为 A
的参数,return 类型为 B
.
要解决这个问题,您可以使用花括号 {}
或双 ()
来解决这个问题:
方法一
在A(i)
周围使用{}
。
//----v----v------->declares a variable of type B and is not a function declaration
B b{A(i)};
方法二
使用双括号(())
。
//-v--------v------>declares a variable of type B and is not a function declaration
B b( (A(i)) );
假设我有 类 A, B:
class A
{
int a;
public:
A(int a) : a(a) { }
};
class B
{
A a;
public:
B(A a) : a(a) { }
};
我想创建一个 B 的实例:
int i = 1;
B b(A(i));
但是当我实际尝试使用 b 时,我遇到了描述的问题 here。也就是说,b 不是 B 的实例,它是 returns B 类型对象的函数。但是,它与链接问题的情况不同,我不明白为什么会发生在这里。
我可以将 B 创建为:
int i = 1;
A a(i);
B b(a);
甚至是:
B b(A(1));
它会奏效的。但是,在实际情况下,第一个选项需要太多行,而第二个选项需要很长的行(因为我有一个需要构造的对象而不是 int,而且我有一些对象链)。如何在自己的行创建int,然后在同一行创建A和B?
排除任何可能的函数声明的一个明显方法是:
B b { A {i} };
问题是B b(A(i));
是一个函数声明,而不是B
类型的变量b
的声明。
这就是所谓的most vexing parse。特别是声明:
B b(A(i)); //this is a declaration for a function named `b` that takes parameter of type A and has no return type
以上是一个名为 b
的函数的 声明 ,该函数接受一个类型为 A
的参数,return 类型为 B
.
要解决这个问题,您可以使用花括号 {}
或双 ()
来解决这个问题:
方法一
在A(i)
周围使用{}
。
//----v----v------->declares a variable of type B and is not a function declaration
B b{A(i)};
方法二
使用双括号(())
。
//-v--------v------>declares a variable of type B and is not a function declaration
B b( (A(i)) );