0

我正在尝试将 C 结构包装在 C++ 类中以利用内存管理等。我把这个结构变成了一个私人成员,并提供了一个公共功能来提供访问权限。返回类型是常量,因为所有将对象作为参数的函数都const在其签名中。

#include <gsl/gsl_rng.h>

class GSLRand {
    gsl_rng* r_;    // see links below

public:
    GSLRand() {
        gsl_rng_env_setup();
        r_ = gsl_rng_alloc(gsl_rng_default);
    }

    ~GSLRand() {
        gsl_rng_free(r_);
    }

    const gsl_rng* rng() {
        return r_;
    }   
};

这一切都编译得很好。当我变得聪明并尝试添加复制构造函数时,就会出现问题。把它引入课堂,比如......

public:
....
    GSLRand(const GSLRand& R) {
        r_ = gsl_rng_alloc(gsl_rng_taus);
        gsl_rng_memcpy(r_, R.rng());
}
....

我收到以下编译器错误:

GSLRand.h:在复制构造函数“GSLRand::GSLRand(const GSLRand&)”中:
GSLRand.h:35:错误:将 'const GSLRand' 作为 'gsl_rng* GSLRand::rng()' 的 'this' 参数传递会丢弃限定符

我在 Mac 上使用 g++。我已经尝试了不同的变体,但仍然无法弄清楚我是如何混淆编译器(或我自己!)。有趣的是,当我constrng().

有任何想法吗?

有关使用的函数的文档: 随机数生成,“环境变量”和“复制生成器”部分。

4

3 回答 3

5

制作rng()const 函数:const gsl_rng* rng() const {.

于 2010-09-29T20:49:21.857 回答
3

将此函数更改为:

const gsl_rng* rng() const {
    return r_;
}   
于 2010-09-29T20:50:20.497 回答
2

两个问题。首先,您const通过const对象引用调用非成员函数。不能那样做。您可以创建GSLRand::rnd()一个const成员函数:

const gsl_rng* rng() const {

...但是您还有第二个问题:gsl_rng()返回 a const gsl_rng*,但您试图将其分配给非const成员变量。也不能这样。

岔路。要么总是const通过r_指针调用成员函数,要么有时const通过它调用非成员函数。

如果你总是调用const成员函数,那么让成员变量指向 a const gsl_rng

const class gsl_rng* r_;    // see links below

否则,让你的rng()函数返回一个非const指针,同时保持方法本身const

gsl_rng* rng() const {
        return r_;
    }   
于 2010-09-29T20:57:48.477 回答