在头文件中定义成员对象时调用非空构造函数

时间:2014-07-31 00:55:11

标签: c++ syntax

我觉得这只是一个单纯的语法问题,但我无法找到一种独特/简洁的方式来描述它,因此谷歌没有帮助。

这是一个代码片段,可以看到我在说什么。在评论中指出了阻止编译的部分。

加入deck.h:

#include <random>
#include <iostream>

class Deck{
    int top;
    int cards[52];

    public:
     Deck();
     void shuffle();

    private:
        // the "(0,51)" on the following line is a syntax error
        // without it, compilation is fine
        std::uniform_int_distribution<int> distribution(0,51);
        std::shuffle_order_engine<std::default_random_engine, 52> engine;
};

Deck.cpp:

#include "Deck.h"
#include <random>
#include <algorithm>

Deck::Deck(){}

void Deck::shuffle(){
    top = 0;
    int oldCards[52];
    std::copy_n(cards, 52, oldCards);
    for(int i = 0; i < 52; i++){
        int random = distribution(engine);
        std::cout << "random= " << random << std::endl;
        cards[i] = oldCards[random];
    }
}

我需要将uniform_int_distribution实例化,范围为0到51,以便对牌组进行洗牌。我可以将它声明为指针并动态分配它,但这似乎不应该是必要的。

根据C语言的经验,我正在努力学习编写好的,惯用的C ++代码,所以你能指出的任何其他内容都值得赞赏。当然,一旦我可以进行编译,将调试实际的混洗工作。

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

您可以使用花括号或复制初始化语法。

或者,您可以在每个构造函数的成员初始化列表中初始化该成员。

对于C ++ 03,后者是唯一的可能性。


大括号:

std::uniform_int_distribution<int> distribution{ 0, 51 };

复制初始化语法(仅在类型可复制或可移动时可用):

std::uniform_int_distribution<int> distribution =
    std::uniform_int_distribution<int>( 0, 51 );

构造函数成员初始化列表中的初始化:

Deck::Deck()
    : distribution( 0, 51 )
{}

答案 1 :(得分:0)

在类声明中初始化成员时,C ++ 11支持括号和大括号,例如:

class Deck
{
    ...   
    private:
        std::uniform_int_distribution<int> distribution(0,51);
        ...
};

class Deck
{
    ...   
    private:
        std::uniform_int_distribution<int> distribution{0,51};
        ...
};

对于非C ++ 11编译器,您必须使用包含类的构造函数的初始化列表来为类成员构造函数(C ++ 11编译器静默提供)将上面的代码翻译成幕后的这个逻辑,例如:

class Deck
{
    ...   
    private:
        std::uniform_int_distribution<int> distribution; // <-- DO NOT try to invoke the constructor here!
        ...
};

Deck::Deck()
  : distribution(0,51) <-- invoke the constructor here instead!
{
}