1

这给了我 C3867:(您试图获取成员函数的地址,而没有使用其类名和地址运算符限定成员函数。)

    //.h
class Entity
{
private:
    const std::ranlux24_base random_engine(std::random_device);
    void Print();
};

    //.cpp
            void  Entity::Print()
            {
          std::uniform_int_distribution<int> uniform_dist(0, 10);
          cout << uniform_dist(random_engine);
            }

C++ 中的新功能。如果我在本地声明 random_engine:

void  Entity::Print()
{
std::random_device rd;
std::ranlux24_base e1(rd());
std::uniform_int_distribution<int> uniform_dist(1, 3);
int val = uniform_dist(e1);
}
  • 所有的warks...无法理解什么是原因..
4

2 回答 2

3

我相信您想要一个随机设备和 prng 引擎作为 .cpp 文件中的静态类成员或局部变量。在 C++11 中,分发对象使用提供的随机引擎,使用设备提供的初始种子正确播种,以生成它们的分发。重要的是,您只构建一次设备,并提供一次播种(如果可能)。当您查看您呈现的“工作”代码时,这正是它所做的。

因此,如果您想避免在每次调用 to 时重新创建设备和引擎Entity::Print(),您有多种选择。一种是使它们成为类静态成员:

在您的标题中:

class Entity
{
private:
    static std::random_device rd;
    static std::ranlux24_base rng;
    void Print();
};

在您的 .cpp 文件中:

std::random_device Entity::rd;
std::ranlux24_base Entity::rng(Entity::rd());

void  Entity::Print()
{
    std::uniform_int_distribution<int> uniform_dist(0, 10);
    std::cout << uniform_dist(rng);
}

但是,如果它们仅用于 Entity.cpp 文件的Entity::Print()方法中,则将它们设为静态是毫无意义的,在这种情况下,您可以这样做:

在标题中:

class Entity
{
private:
    void Print();
};

在 cpp 文件中:

void  Entity::Print()
{
    static std::random_device rd;
    static std::ranlux24_base rng(rd());

    std::uniform_int_distribution<int> uniform_dist(0, 10);
    std::cout << uniform_dist(rng);
}
于 2013-09-14T10:18:00.363 回答
0

像这样做。您正在重新定义 .cpp 文件中的类。你不应该。

    //.h
class Entity
{
private:
    const std::ranlux24_base random_engine(std::random_device);
    void Print();
};

    //.cpp
void  Entity::Print()
{
    std::uniform_int_distribution<int> uniform_dist(0, 10);
    cout << uniform_dist(random_engine);
}
于 2013-09-14T10:17:05.577 回答