Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание локального временного объекта в конструкторе / 10 сообщений из 10, страница 1 из 1
27.02.2014, 00:43
    #38573639
igas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
Приветствую всех!

Столкнулся с интересной ситуацией, при попытке создать в конструкторе локальный временный объект, компилятор выводит ошибку error C2082: redefinition of formal parameter 'num'

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <iostream> 

using namespace std;

class Base
{
public:
	Base() { cout << "Base: Constructor" << endl; }
	Base(int num) { cout << "Base: Constructor with param"<< endl; }
	~Base() { cout << "Base: Destructor" << endl; }
};

class Delivered : public Base
{
	int nmb;
public:
	Delivered() { cout << "Delivered: Constructor" << endl; }
	Delivered(int num)
	{
		nmb = num;
		//Base(num); // не работает, error C2082: redefinition of formal parameter 'num'
		Base((int)num);
		cout << "Delivered: Constructor with param" << endl;
	}
	~Delivered() { cout << "Delivered: Destructor" << endl; }
};

int main()
{
	Delivered ob(1);

	return 0;
}


Visual Studio 2013


Может кто-нибудь пояснит?
...
Рейтинг: 0 / 0
27.02.2014, 00:58
    #38573644
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
igas
Код: plaintext
1.
		//Base(num); // не работает, error C2082: redefinition of formal parameter 'num'

это не создание локального временного объекта, компилятор пытается это интерпретировать как вызов функции Base( int ); а почему такая странная диагностика, то этот вопрос - к разработчикам студии
создание локального временного объекта пишется так:
Код: plaintext
1.
Base var( num );
...
Рейтинг: 0 / 0
27.02.2014, 01:18
    #38573650
igas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
egorych,

так эти почему работают?
Base((int)num);
Base(10);
...
Рейтинг: 0 / 0
27.02.2014, 01:52
    #38573662
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
Это следствие того, что
Код: plaintext
1.
Base(num);


это то же самое что
Код: plaintext
1.
Base num;



а
Код: plaintext
1.
Base((int)num);


не является объявлением переменной, т.к. следующая конструкция невозможна
Код: plaintext
1.
Base (int)num;



ЗЫ. А вообще скобки в объявлениях разрешены из-за указателей на функции и массивы, которые иначе бы нельзя было объявить. А в итоге с таким же успехом скобки можно применить и не только для указателей, т.к. парсер все равно их разбирает.
...
Рейтинг: 0 / 0
27.02.2014, 01:57
    #38573664
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
Самое главное забыл.

Ваш код
Код: plaintext
1.
Base((int)num);

- не работает так как вы думаете.
Вы думаете что этим вы инициализируете предка из конструктора наследника.
А на самом деле вы просто создаете локальную анонимную переменную типа Base и она тут же уничтожается. А предок остается инициализированным своим конструктором по умолчанию.
Правильно делать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Delivered : public Base
{
	int nmb;
public:
	Delivered() { cout << "Delivered: Constructor" << endl; }
	Delivered(int num)
	  : Base(num) 
	{
		nmb = num;
		cout << "Delivered: Constructor with param" << endl;
	}
	~Delivered() { cout << "Delivered: Destructor" << endl; }
};
...
Рейтинг: 0 / 0
27.02.2014, 02:51
    #38573673
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
Хотя счас перечитал название темы и понял, что вы таки хотели локальную анонимную переменную

Зачем?!!!
...
Рейтинг: 0 / 0
27.02.2014, 11:29
    #38573895
igas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
Anatoly MoskovskyСамое главное забыл.

Ваш код
Код: plaintext
1.
Base((int)num);

- не работает так как вы думаете.
Вы думаете что этим вы инициализируете предка из конструктора наследника.
А на самом деле вы просто создаете локальную анонимную переменную типа Base и она тут же уничтожается. А предок остается инициализированным своим конструктором по умолчанию.
Правильно делать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Delivered : public Base
{
	int nmb;
public:
	Delivered() { cout << "Delivered: Constructor" << endl; }
	Delivered(int num)
	  : Base(num) 
	{
		nmb = num;
		cout << "Delivered: Constructor with param" << endl;
	}
	~Delivered() { cout << "Delivered: Destructor" << endl; }
};



Я знаю как это работает;)

А вот это не совсем понятно
Anatoly MoskovskyЭто следствие того, что
Код: plaintext
1.
Base(num);



это то же самое что
Код: plaintext
1.
Base num;
...
Рейтинг: 0 / 0
27.02.2014, 12:16
    #38573959
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
egorychigas
Код: plaintext
1.
		//Base(num); // не работает, error C2082: redefinition of formal parameter 'num'

это не создание локального временного объекта, компилятор пытается это интерпретировать как вызов функции Base( int ); а почему такая странная диагностика, то этот вопрос - к разработчикам студии
создание локального временного объекта пишется так:
Код: plaintext
1.
Base var( num );



Это локальный автоматический объект, а не временный.
...
Рейтинг: 0 / 0
27.02.2014, 13:58
    #38574135
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
igasА вот это не совсем понятно
Anatoly MoskovskyЭто следствие того, что
Код: plaintext
1.
Base(num);



это то же самое что
Код: plaintext
1.
Base num;


А так понятней?
Код: plaintext
1.
int (num);

это то же самое что
Код: plaintext
1.
int num;
...
Рейтинг: 0 / 0
27.02.2014, 22:47
    #38574797
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание локального временного объекта в конструкторе
igasЯ знаю как это работает;)

А вот это не совсем понятно
Anatoly MoskovskyЭто следствие того, что
Код: plaintext
1.
Base(num);



это то же самое что
Код: plaintext
1.
Base num;


Most vexing parse
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание локального временного объекта в конструкторе / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]