在类实现中不能使用类字段

时间:2013-09-14 10:08:24

标签: c++ class

这给了我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 localy:

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);
}
  • 所有的战争......不能不明白是什么原因..

2 个答案:

答案 0 :(得分:3)

我相信你想要一个随机设备和prng引擎作为.cpp文件中的静态类成员或局部变量。在C ++ 11中,分发对象使用提供的随机引擎,适当地使用设备提供的初始种子播种,以生成它们的分布。重要的是,您只需构建设备一次,并在可能的情况下提供种子一次。当你看到你所呈现的代码“有效”时,它正是它的作用。

因此,如果您想避免在每次调用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);
}

答案 1 :(得分: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);
}