powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание локального временного объекта в конструкторе
10 сообщений из 10, страница 1 из 1
Создание локального временного объекта в конструкторе
    #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
Создание локального временного объекта в конструкторе
    #38573644
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igas
Код: plaintext
1.
		//Base(num); // не работает, error C2082: redefinition of formal parameter 'num'

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

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


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



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


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



ЗЫ. А вообще скобки в объявлениях разрешены из-за указателей на функции и массивы, которые иначе бы нельзя было объявить. А в итоге с таким же успехом скобки можно применить и не только для указателей, т.к. парсер все равно их разбирает.
...
Рейтинг: 0 / 0
Создание локального временного объекта в конструкторе
    #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
Создание локального временного объекта в конструкторе
    #38573673
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя счас перечитал название темы и понял, что вы таки хотели локальную анонимную переменную

Зачем?!!!
...
Рейтинг: 0 / 0
Создание локального временного объекта в конструкторе
    #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
Создание локального временного объекта в конструкторе
    #38573959
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychigas
Код: plaintext
1.
		//Base(num); // не работает, error C2082: redefinition of formal parameter 'num'

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



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



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


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

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

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



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


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


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