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

时间:2012-01-17 11:31:13

标签: c++ constructor default most-vexing-parse

  

可能重复:
  Why is it an error to use an empty set of brackets to call a constructor with no arguments?
  Constructing Objects and Calling Member functions

最近我学到了一些关于构造函数的知识,但是今天我一直无法为构造函数参数设置默认值。

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

class PlayingCard {
public:
    PlayingCard(int value = 0, int suit = 0); //default values supplied

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

PlayingCard::PlayingCard(int value, int suit) :  _faceValue(value), _suit(suit)
{}

_faceValue_suit是PlayCard的私人会员) 当我像这样去测试时:

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;

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

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

2 个答案:

答案 0 :(得分:5)

PlayingCard card1();

不声明对象,它声明函数。
它声明了一个名为card1的函数,该函数不接受任何参数并返回类型为PlayingCard的对象。

要声明您应该执行的对象:

PlayingCard card1;

这在C ++中称为 Most Vexing Parse 我今天第二次回答。看起来很烦人!

答案 1 :(得分:1)

PlayingCard card1();

这会产生歧义,因为这可以被视为具有返回类型PlayingCard和带有零参数的签名card1的函数原型。最好在card1之后删除()并查看。