复制构造函数的const正确性问题?

时间:2010-09-29 20:46:37

标签: c++ compiler-errors gsl

我正在尝试将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: In copy constructor ‘GSLRand::GSLRand(const GSLRand&)’:
GSLRand.h:35: error: passing ‘const GSLRand’ as ‘this’ argument of ‘gsl_rng* GSLRand::rng()’ discards qualifiers

我在Mac上使用g ++。我尝试了不同的变种,仍然无法弄清楚我是如何混淆编译器(或我自己!)。有趣的是,当我从const中删除rng()说明符时出现相同的错误。

有什么想法吗?

有关使用的功能的文档: random number generation,关于“环境变量”和“复制生成器”的部分。

3 个答案:

答案 0 :(得分:5)

使rng() const函数:const gsl_rng* rng() const {

答案 1 :(得分:3)

将此功能更改为:

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

答案 2 :(得分:2)

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

const gsl_rng* rng() const {

...但是您遇到第二个问题:gsl_rng()会返回const gsl_rng*,但您尝试将其分配给非const成员变量。也不能这样做。

在路上岔开。您总是通过const指针调用r_成员函数,或者有时通过它调用非const成员函数。

如果您始终致电const成员函数,请将成员变量指向const gsl_rng

const class gsl_rng* r_;    // see links below

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

gsl_rng* rng() const {
        return r_;
    }