Здравствуйте, 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;
};
Здравствуйте, alzt, Вы писали:
A>А какая вообще цель? Код довольно корявый.
Цель — узнать синтаксис конструктора для такого случая.
А в чем корявость?
A>По поводу стиля — лучше x_ использовать для членов, а x для параметров.
Почему лучше?
Здравствуйте, 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 происходит путем вызова его конструктора копирования.
Здравствуйте, 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_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.
Здравствуйте, alzt, Вы писали:
A>>>По поводу стиля — лучше x_ использовать для членов, а x для параметров. D>>Почему лучше?
A>Более устоявшееся правило. A>Члены удобно обозначать как m_x или x_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.
С остальным согласен, а тут есть сомнения. Мне кажется это "местечковые" особенности. Где-то так, где-то эдак.
Здравствуйте, 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;
};
А вообще, не стоит забывать, что если вы определяете хоть один конструктор, то конструктор по умолчанию не генерирутся. В таком случае нужно либо определять его явно, либо добавить во все параметры одного из конструкторов значения по умолчанию:
Здравствуйте, Dreama, Вы писали:
A>>Более устоявшееся правило. A>>Члены удобно обозначать как m_x или x_. Когда видишь такие обозначения, то сразу понимаешь, что это член класса, а не локальная или глобальная переменная.
D>С остальным согласен, а тут есть сомнения. Мне кажется это "местечковые" особенности. Где-то так, где-то эдак.
Зависит, конечно, от места. Я видел 3 основных правила:
1. Добавлять m_ перед данными членами.
2. Добавлять _ после данных-членов.
3. Вообще ничего не добавлять.
Но ни разу не видел, чтобы _ прибавляли к аргументам функции.
Читать не привычно. На абсолютную истину не претендую.