Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';不要在类实现中使用类字段_C++_Class - Fatal编程技术网

C++ Can';不要在类实现中使用类字段

C++ Can';不要在类实现中使用类字段,c++,class,C++,Class,这给了我C3867:(您试图获取成员函数的地址,但没有使用其类名和运算符地址限定成员函数。) /.h 类实体 { 私人: const std::ranlux24_基随机_引擎(std::随机_设备); 作废打印(); }; //.cpp void实体::Print() { 标准:均匀分布均匀分布(0,10); 不能这样做。您正在.cpp文件中重新定义类。您不应该这样做 //.h class Entity { private: const std::ranlux24_base ra

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

/.h
类实体
{
私人:
const std::ranlux24_基随机_引擎(std::随机_设备);
作废打印();
};
//.cpp
void实体::Print()
{
标准:均匀分布均匀分布(0,10);

不能这样做。您正在.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);
}
/.h
类实体
{
私人:
const std::ranlux24_基随机_引擎(std::随机_设备);
作废打印();
};
//.cpp
void实体::Print()
{
标准:均匀分布均匀分布(0,10);

cout我相信您需要一个随机设备和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);
}
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);
}
在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);
}
void实体::Print()
{
静态std::随机_设备rd;
静态标准::ranlux24_基础rng(rd());
标准:均匀分布均匀分布(0,10);

std::您是否可以将
random\u engine
声明为成员函数(返回
const std::ranlux24\u base
并获取类型为
std::random\u device
的一个参数).你打算改为数据成员吗?是的…数据成员…就像C#中的字段一样,不是每次都会重新创建本地静态吗?我对性能和内存非常匹配…@Brans No.这是一次性成功。上述两种情况都将创建一个设备和引擎对象(除非
Entity
是一个模板类,在这种情况下,每扩展一个类型就有一个)。这就是我将它们设置为
static
的原因。我有点想你会有很多
Entity
对象执行它们的
Print()
operation.yes我有很多实体对象..我没有使用种子值。当我们使用随机设备而不是种子时,我们会得到不可预测的序列(我需要这个)价值观AFAK@Brans我也这么认为。上面的代码应该满足您的要求,很可能第二个示例就足够了。只是不要使用设备。如果您想要一个可复制的序列,请使用定义的种子。我可以使用time()对于一粒种子来说,但这个装置有什么不好呢?它是特别的,所以我下结论说它可能是bertter。。
class Entity
{
private:
    void Print();
};
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);
}