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

标签 c++ syntax

我觉得这只是一个句法问题,但我找不到一种独特/简洁的方式来描述它,所以 Google 没有帮助。

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

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;
};

甲板.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];
    }
}

我需要用 0 到 51 的范围实例化 uniform_int_distribution 来洗牌。我可以将其声明为指针并动态分配它,但这似乎没有必要。

根据 C 语言的经验,我正在努力学习编写良好的、惯用的 C++ 代码,所以您能指出的任何其他内容都将不胜感激。当然,一旦我可以编译,就会调试 shuffling 的实际工作。

感谢您的任何回答。

最佳答案

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

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

对于 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 )
{}

关于c++ - 在头文件中定义成员对象时调用非空构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049300/

相关文章:

Java语法-转换后的额外加号有效吗?

c# - 如何处理 String.Format 方法?

generics - 类型参数与 std::ops::BitXor 输出关联类型之间的类型不匹配

c++ - 如何在 C++ 中创建静态类?

c++ - 如何在 CLion 中启用 C++11?

C++从多个具有相同虚函数名的基类继承

c++ - C++ 中 64 位整数的按位 (Bitshift) 运算

c++ - 我怎样才能使窗口的一部分透明? (WIN32)

c++ - 调用@plt函数时dlopen/static init上的共享库SIGSEGV

c++ - 有人可以解释以下 C++ 语法吗?