передача 'const Class2' в качестве аргумента 'this' для int Class1 :: get_data () 'отбрасывает квалификаторы - PullRequest
1 голос
/ 25 августа 2011

Я пытаюсь настроить конструктор копирования, и я получаю эту ошибку

class Class1{
public:
    int get_data();
    void set_data(int);
private:
    int d;
};

int Class1::get_data(){
    return d;
}

void Class1::set_data(int data){
    d = data;
}

class Class2 : public Class1{
    Class2(const Class2&);
};

Class2::Class2(const Class2 &c2) : Class1(){
    set_data(c2.set_data());
}

Какое решение этой проблемы.Я прочитал некоторые из предыдущих вопросов, и я понимаю, почему это происходит.но сделать set_data () const не вариант.

каков принятый подход для конструкторов копирования?

спасибо,

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Вы могли бы просто написать конструктор для Class1 с параметром int:

class Class1 {
    explicit Class1 (int i) : d (i) {}
    // as before
};

class Class2 : public Class1 {
    Class2 (Class2 const & c2) : Class1 (c2.get_data ()) {}
};

Однако здесь должен быть предусмотрен конструктор копирования по умолчанию (т. Е. Вам не нужно писать свой собственный, компилятор будетсделайте это за вас).

Вообще говоря, вы должны использовать списки инициализации:

http://www.parashift.com/c++-faq-lite/ctors.html

в конструкторах (прочитайте всю запись в faq)

Редактировать: Вы забыли квалификатор const для своей функции get_data.

0 голосов
/ 25 августа 2011

Разве вы не хотите:

set_data(c2.get_data());

(и сделать Class1::get_data() функцию-члена const)?

Но вам действительно следует использовать списки инициализации конструктора:

Class2::Class2(const Class2 &c2)
    : Class1(c2)
{
}

Этот код использует сгенерированный компилятором конструктор копирования по умолчанию для Class1.Во многих случаях вам не следует использовать конструктор копирования по умолчанию или перегрузку оператора копирования-назначения, но здесь все в порядке, поскольку единственный элемент данных Class1 является объектом int.

Фактически, вы могли быдаже полагаться на созданный компилятором конструктор копирования по умолчанию для Class2.

РЕДАКТИРОВАНИЕ: Вот пример кода:

#include <iostream>

class Class1{
public:
    Class1() : d(0) { } // Provide a no-arg constructor to initialize `d`

    int get_data() const; // Class1::get_data() is `const` because it does not change the `Class1` object.
    void set_data(int);
private:
    int d;
};

int Class1::get_data() const{
    return d;
}

void Class1::set_data(int data){
    d = data;
}

class Class2 : public Class1{
public:
    Class2();
};

Class2::Class2()
    : Class1()
{
}

int main() {
    Class2 other_c2;
    other_c2.set_data(14);
    Class2 c2(other_c2);
    std::cout << c2.get_data() << '\n';
}

http://codepad.org/jlplTYrH

...