相关疑难解决方法(0)

我对值初始化的尝试被解释为函数声明,为什么不是A a(()); 解决这个问题?

Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明

A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)

虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线

A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)

也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明

A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)

但是,在第二种情况下,执行相同操作会导致编译错误

A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?

c++

154
推荐指数
5
解决办法
2万
查看次数

在C ++中设置构造函数默认值

可能重复:
为什么使用一组空括号来调用不带参数的构造函数会出错?
构造对象和调用成员函数

最近,我对构造函数有了一些了解,但是今天,在设置构造函数参数的默认值时遇到了麻烦。

hpp文件中的构造函数声明如下所示:

class PlayingCard {
public:
    PlayingCard(int value = 0, int suit = 0); //default values supplied
Run Code Online (Sandbox Code Playgroud)

cpp文件中的定义如下所示:

PlayingCard::PlayingCard(int value, int suit) :  _faceValue(value), _suit(suit)
{}
Run Code Online (Sandbox Code Playgroud)

_faceValue并且_suit是PlayingCard的私人成员)当我像这样测试时:

PlayingCard card1();
PlayingCard card2(7, 1);

cout << "suit int value: " << card1.getSuit() <<
        " face value: " << card1.getFaceValue() << endl;
cout << "suit int value: " << card2.getSuit() <<
        " face value: " << card2.getFaceValue() << endl;
Run Code Online (Sandbox Code Playgroud)

如果我注释掉有关card1的代码,则card2可以正常工作。否则我得到错误: 请求'card1'中的成员'getSuit',它是非类类型'PlayingCard()'。

哪个必须意味着它不能识别没有参数的构造函数的使用?我究竟做错了什么?

c++ constructor default most-vexing-parse

1
推荐指数
1
解决办法
4850
查看次数

标签 统计

c++ ×2

constructor ×1

default ×1

most-vexing-parse ×1