LINUX.ORG.RU

конструкторы в С++


0

0

Есть такой тод:
class A {
...
public:
A(int param1 = 0) { A(0, param1); }
A(int* param0, int param1 = 0)
...
};
...
A a(2);
Вопрос: при вызове конструктора A(0, param1) в теле другого конструктора будет создан тотже объект (получается некая обуртка к конструктору) или будет создат временный объект?

> Вопрос: при вызове конструктора A(0, param1) в теле другого конструктора будет создан тотже объект (получается некая обуртка к конструктору) или будет создат временный объект?

новый временный

lester ★★★★
()

новый временный

mono ★★★★★
()

Костыль:

class _A {
	...
public:
	_A(int *p0, int p1) {}
	...
};

class A: public _A {
public:
	A(int p1 = 0): _A(0, p1) {}
	A(int *p0, int p1 = 0): _A(p0, p1) {}
};

A a(2);

const86 ★★★★★
()
Ответ на: комментарий от lester

> а не проще добавить метод, например Init, и вызвать его из конструктора с соот-ми параметрами? :)

Что так костыль, что эдак. Зато у меня интереснее :)

const86 ★★★★★
()
Ответ на: комментарий от lester

> с чего это отдельный метод для инициализации это костыль? о_О

Потому что "метод для инициализации" - это конструктор вообще-то должен бы быть. ЕМНИП, в яве можно вызывать один конструктор из другого, выглядит нормально.

const86 ★★★★★
()
Ответ на: комментарий от const86

> Потому что "метод для инициализации" - это конструктор вообще-то должен бы быть

читайте литературу :)

lester ★★★★
()
Ответ на: комментарий от const86

>ЕМНИП, в яве можно вызывать один конструктор из другого, выглядит >нормально.

В новом стандарте плюсов тоже будет возможно .

kitov ★★★
()
Ответ на: комментарий от lester

> а не проще добавить метод, например Init, и вызвать его из конструктора с соот-ми параметрами? :)

А вот такой выпендрёж с методом для инициализации можете изобразить?

class _A {
protected:
	int &x;
public:
	_A(int &x): x(x) {}
};

class A: public _A {
public:
	A(int &x): _A(x) {}
	A(int y, int &z): _A(z) { x += y; }
};

const86 ★★★★★
()
Ответ на: комментарий от mannaz

> А что есть какие-то проблемы в выбрасывании исключений из конструкторов?

да - для такого локального объекта не вызывается деструктор, и если что-то успел выделить в конструкторе, но не учел этот факт( типа все в деструкторе прописано ), то будут утечки памяти

lester ★★★★
()
Ответ на: комментарий от const86

> А вот такой выпендрёж с методом для инициализации можете изобразить?

не вижу выпендрёжа - что тут невозможного для метода?

lester ★★★★
()
Ответ на: комментарий от mannaz

> Кроме того, надо приучать студентов к scoped/shared_ptr'ам :)

тут спорить не буду :)

lester ★★★★
()
Ответ на: комментарий от const86

> Поля-ссылки должны инициализироваться из конструктора.

опять видно ваши слабые знания :)

в конструкторе пишем : x( x ), т.е. инициализируем поле самим собой( кстати у вас очипятка - компилятор наругается на ваш x( x ) ), после чего спокойно делаем нужное присваивание для того же х

lester ★★★★
()
Ответ на: комментарий от lester

> опять видно ваши слабые знания :)

Да что вы говорите!

> в конструкторе пишем : x( x ), т.е. инициализируем поле самим собой

В каком? У меня это написано в одном. А по-вашему придётся писать во всех, чего как раз и хочется избежать.

> кстати у вас очипятка - компилятор наругается на ваш x( x )

Странно, не ругается, даже в режиме максимальной болтливости.

const86 ★★★★★
()
Ответ на: комментарий от const86

> Да что вы говорите!

ну вы ведь считали, что через метод решить невозможно ;)

> В каком? У меня это написано в одном. А по-вашему придётся писать во всех, чего как раз и хочется избежать.


я бы вообще так не делал - как писал выше человек smart_prt наше все, но и в данном случае я считаю, что моя одна лишняя строка для инициализации во втором конструкторе гораздо читабельнее и правильнее чем ваши 6 строк на новый класс, наследование от него, и еще по одной строке в каждом конструкторе на вызов конструктора базового класса :)

> Странно, не ругается, даже в режиме максимальной болтливости.


чем собираете? тут явно неоднозначность - просто обязано ругаться

lester ★★★★
()
Ответ на: комментарий от lester

> ну вы ведь считали, что через метод решить невозможно ;)

Выполнить инициализацию поля-ссылки не из конструктора невозможно.

> я бы вообще так не делал

Да я бы тоже. О чём и пытался толсто намекнуть словами "костыль" и "выпендрёж". Не принимайте близко к сердцу.

> моя одна лишняя строка для инициализации во втором конструкторе гораздо читабельнее и правильнее чем ваши 6 строк на новый класс, наследование от него, и еще по одной строке в каждом конструкторе на вызов конструктора базового класса :)

Не буду утверждать про этот случай, но в C++ зачастую приходится выбирать между кратким читабельным кодом и кодом, точнее отражающим желаемое в терминах C++.

> чем собираете? тут явно неоднозначность - просто обязано ругаться

GCC 4.3 с флажками -std=c++98 -pedantic -Wall. Про какую неоднозначность речь?

const86 ★★★★★
()
Ответ на: комментарий от kitov

> Где написано что должно ?

нигде, это сугубо мое ИМХО, что раз тут можно интерпретировать запись x( x ) неоднозначно, то правильно было бы выдать warning

lester ★★★★
()
Ответ на: комментарий от const86

> GCC 4.3 с флажками -std=c++98 -pedantic -Wall. Про какую неоднозначность речь?

x( х ) - аргумент может быть как полем, так и параметром; да, проверил в gcc - не ругается, значит я излишне придирчив

lester ★★★★
()

хм, gcc даже на такое не ругается:

int& setx( int& x ) { x = x; return x; }

по-моему это неправильно

lester ★★★★
()
Ответ на: комментарий от lester

> int& setx( int& x ) { x = x; return x; }

> по-моему это неправильно

Внутри {} все иксы означают одно - параметр функции. Если где-то снаружи и есть другой x, он перекрывается. Что ж тут неправильно?

Фокус с инициализацией x(x), видимо, работает по аналогичному принципу. Первый x может быть либо полем, либо базовым классом, а второй может быть и параметром конструктора тоже. Поэтому всё работает как задумано.

const86 ★★★★★
()
Ответ на: комментарий от const86

> Если где-то снаружи и есть другой x, он перекрывается

да - так область видимости работает для блоков, не знал, что и для методов тоже, век живи - век учись, тут уже я облажался :)

lester ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.