проблема правильности с конструктором копирования? - PullRequest
0 голосов
/ 30 сентября 2010

Я пытаюсь обернуть структуру 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

Я использую g ++ на Mac.Я пробовал разные варианты и до сих пор не могу понять, как я путаю компилятор (или себя!).Интересно, что я получаю ту же ошибку при удалении спецификатора const из rng().

Есть идеи?

Для документирования используемых функций: генерация случайных чисел, разделы «Переменные среды» и «Копирование генераторов».

Ответы [ 3 ]

5 голосов
/ 30 сентября 2010

Make rng() const function: const gsl_rng* rng() const {.

3 голосов
/ 30 сентября 2010

Измените эту функцию на:

const gsl_rng* rng() const {
    return r_;
}   
2 голосов
/ 30 сентября 2010

Две проблемы. Во-первых, вы вызываете функцию, не являющуюся членом const, через ссылку на объект const. Не могу этого сделать. Вы можете сделать GSLRand::rnd() a const функцию-члена:

const gsl_rng* rng() const {

... но у вас возникает вторая проблема: gsl_rng() возвращает const gsl_rng*, но вы пытаетесь присвоить это переменной, не являющейся const. Так же не могу.

Вилка в дороге. Либо вы всегда вызываете const функции-члены через указатель r_, либо вы иногда вызываете не-1017 * функции-члены через него.

Если вы всегда вызываете const функций-членов, тогда переменная-член должна указывать на const gsl_rng:

const class gsl_rng* r_;    // see links below

В противном случае ваша функция rng() возвращает указатель, отличный от const, сохраняя при этом сам метод const:

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