Синтаксис конструктора копирования
От: Dreama Россия  
Дата: 07.10.08 13:49
Оценка:
Не соображу, как в данном случае записать конструктор копирования для a2

class a1
{
public:
    a1(int x_)    { x = x_; }
    virtual ~a1() { }

private:
    int x;
};

class a2: public a1
{
public:
    a2(int y, int x_): a1(x_) { y = y_; }
    virtual ~a2() { }

    a2( a2 &src ) 
    {
        y = src.y;
    }

private:
    int y;
};


в таком виде компилятор жалуется, что для a1 нет дефолтного конструктора.
Re: Синтаксис конструктора копирования
От: alzt  
Дата: 07.10.08 13:59
Оценка:
Здравствуйте, Dreama, Вы писали:

D>Не соображу, как в данном случае записать конструктор копирования для a2


D>
D>class a1
D>{
D>public:
D>    a1(int x_)    { x = x_; }
D>    virtual ~a1() { }

D>private:
D>    int x;
D>};

D>class a2: public a1
D>{
D>public:
D>    a2(int y, int x_): a1(x_) { y = y_; }
D>    virtual ~a2() { }

D>    a2( a2 &src ) 
D>    {
D>        y = src.y;
D>    }

D>private:
D>    int y;
D>};
D>


D>в таком виде компилятор жалуется, что для a1 нет дефолтного конструктора.


А какая вообще цель? Код довольно корявый.
Можно использовать конструктор копирования класса a1:

a2( a2 &src ):a1(src),y(src.y)
{
}


По поводу стиля — лучше x_ использовать для членов, а x для параметров.
Re: Синтаксис конструктора копирования
От: Аноним  
Дата: 07.10.08 14:00
Оценка:
Здравствуйте, Dreama, Вы писали:

D>Не соображу, как в данном случае записать конструктор копирования для a2

...
D>в таком виде компилятор жалуется, что для a1 нет дефолтного конструктора.

Правильно жалуется... подправил немного:
class a1
{
public:
    a1(int x_)    { x = x_; }
    virtual ~a1() { }
    
    a1(const a1& a): x(a.x)    {} // !

private:
    int x;
};

class a2: public a1
{
public:
    a2(int y, int x_) : a1(x_), y(y)
        { 
        }
        
    a2(const a2 &src) 
            : a1(src)       // на самом деле это ': a1(static_cast<const a1&>(src))'
    {
      y = src.y;
    }

private:
    int y;
};
Re[2]: Синтаксис конструктора копирования
От: Dreama Россия  
Дата: 07.10.08 14:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Правильно жалуется... подправил немного:

А>
А>class a1
А>{
А>public:
А>    a1(int x_)    { x = x_; }
А>    virtual ~a1() { }
    
А>    a1(const a1& a): x(a.x)    {} // !

А>private:
А>    int x;
А>};

А>class a2: public a1
А>{
А>public:
А>    a2(int y, int x_) : a1(x_), y(y)
А>        { 
А>        }
        
А>    a2(const a2 &src) 
А>            : a1(src)       // на самом деле это ': a1(static_cast<const a1&>(src))'
А>    {
А>      y = src.y;
А>    }

А>private:
А>    int y;
А>};
 
А>


Тут встают такие вопросы.
Без этой строки код нормально компилируется, это что значит?
a1(const a1& a): x(a.x)    {} // !


А вот это:
a2(const a2 &src) : a1(src)

означает
, что src будет передан в a1 вот сюда:
a1(int x_)

т.е тип a2 конвертируется в тип int?
Re[2]: Синтаксис конструктора копирования
От: Dreama Россия  
Дата: 07.10.08 14:26
Оценка:
Здравствуйте, alzt, Вы писали:

A>А какая вообще цель? Код довольно корявый.

Цель — узнать синтаксис конструктора для такого случая.
А в чем корявость?

A>По поводу стиля — лучше x_ использовать для членов, а x для параметров.

Почему лучше?
Re[3]: Синтаксис конструктора копирования
От: Аноним  
Дата: 07.10.08 14:39
Оценка: 2 (1)
Здравствуйте, Dreama, Вы писали:

D>Тут встают такие вопросы.

D>Без этой строки код нормально компилируется, это что значит?
D>
D>a1(const a1& a): x(a.x)    {} // !
D>


Это и есть конструктор копирования(для a1). Можно выкинуть,т.к. идентичный к-тор генерируется в его отсутствии.

D>А вот это:

D>
D>a2(const a2 &src) : a1(src)
D>

D>означает
D>, что src будет передан в a1 вот сюда:

D>
D>a1(int x_)
D>



это последовательность вызовов:
a2::a2(const a2&)
 a1::a1(const a1&)


так понятнее ?
При выполнении конструктора копирования необходимо полностью инициализировать(создать) объект, включая все его базовые подобъекты. Здесь создание подобъекта a1 происходит путем вызова его конструктора копирования.
Re: Синтаксис конструктора копирования
От: Dreama Россия  
Дата: 07.10.08 15:00
Оценка:
э-э-э.. а куда пост igna делся?
Re[3]: Синтаксис конструктора копирования
От: alzt  
Дата: 07.10.08 17:50
Оценка: 1 (1)
Здравствуйте, Dreama, Вы писали:

D>Здравствуйте, alzt, Вы писали:


A>>А какая вообще цель? Код довольно корявый.

D>Цель — узнать синтаксис конструктора для такого случая.

В данном случае необходимо инициализировать базовый класс. Можно использовать конструктор a1(int x), конструктор копирования (который создаётся в любом случае) или дописать базовый класс. Конструктор a1(int x) вряд ли подойдёт, т.к. у нас нет доступа к x.

D>А в чем корявость?

1. Почему a1(int x_) не explicit?
2. Присваивание y = y_. Используй список инициализации. Плюс ещё ошибки компиляции. y_ вообще нигде не определено.
3. a2( a2 &src ). Почему здесь a2 не константа?

A>>По поводу стиля — лучше x_ использовать для членов, а x для параметров.

D>Почему лучше?

Более устоявшееся правило.
Члены удобно обозначать как m_x или x_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.
Re[4]: Синтаксис конструктора копирования
От: Dreama Россия  
Дата: 08.10.08 15:52
Оценка:
Здравствуйте, alzt, Вы писали:

A>>>По поводу стиля — лучше x_ использовать для членов, а x для параметров.

D>>Почему лучше?

A>Более устоявшееся правило.

A>Члены удобно обозначать как m_x или x_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.

С остальным согласен, а тут есть сомнения. Мне кажется это "местечковые" особенности. Где-то так, где-то эдак.
Re[5]: Синтаксис конструктора копирования
От: Iron_droid Россия  
Дата: 08.10.08 18:44
Оценка:
Здравствуйте, Dreama, Вы писали:

D>С остальным согласен, а тут есть сомнения. Мне кажется это "местечковые" особенности. Где-то так, где-то эдак.


Зато это позволяет избежать неприятных помарок:


class a2: public a1
{
public:
    a2(int y, int x_): a1(x_) { y = y_; } // Тут ошибка!!! Что во что копируется???
    virtual ~a2() { }

    a2( a2 &src ) 
    {
        y = src.y;
    }

private:
    int y;
};


А вообще, не стоит забывать, что если вы определяете хоть один конструктор, то конструктор по умолчанию не генерирутся. В таком случае нужно либо определять его явно, либо добавить во все параметры одного из конструкторов значения по умолчанию:


public:
    a2(int y = 10, int x_ = 20);
Re[5]: Синтаксис конструктора копирования
От: alzt  
Дата: 09.10.08 07:37
Оценка:
Здравствуйте, Dreama, Вы писали:

A>>Более устоявшееся правило.

A>>Члены удобно обозначать как m_x или x_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.

D>С остальным согласен, а тут есть сомнения. Мне кажется это "местечковые" особенности. Где-то так, где-то эдак.


Зависит, конечно, от места. Я видел 3 основных правила:
1. Добавлять m_ перед данными членами.
2. Добавлять _ после данных-членов.
3. Вообще ничего не добавлять.

Но ни разу не видел, чтобы _ прибавляли к аргументам функции.
Читать не привычно. На абсолютную истину не претендую.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.