我正在尝试将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,关于“环境变量”和“复制生成器”的部分。
答案 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_;
}