Перейти к содержанию

C++ конструктор


Antonshka

Рекомендуемые сообщения

Привет всем,

 

кто-нибудь из вас сталкивался с ошибкой компилятора ""error C2082: переопределение формального параметра "pstr"?

скрипт

  Показать контент

 

если вместо

Pstring(const char pstr[])
{ String(pstr); }

записать

Pstring(const char pstr[]) : String(pstr)
{ }

то ошибки нет.

 

Решение проблемы взятое из Microsoft Docs -

В теле функции переопределен формальный параметр функции. Чтобы устранить эту ошибку, удалите повторное определение.

void func(int i) {
   int i;   // C2082
   int ii;   // OK
}

Никак не могу найти причину. Ведь я вызываю конструктор с одним параметром класса String, и передаю ему аргумент pstr.

Как правильно вызвать конструктор String, из тела конструктора Pstring, передав ему при этом параметр pstr?

 

Изменено пользователем Antonshka
Ссылка на комментарий
Поделиться на другие сайты

Выбирай, что больше нравится. Ничего нового тут нет, все что сказано выше.

 

1.

  Показать контент

 

2.

  Показать контент

 

Мне нравится как выглядит второй вариант?

Ссылка на комментарий
Поделиться на другие сайты

В конце книги Лафоре есть ответы на некоторые его задачи. Есть ответ и на эту задачу.

Вот (нерабочий) ответ, из оригинала книги

  Показать контент

 

Непонятно почему в этом скрипте вызывается конструктор базового класса из тела конструктора производного класса.

 

@JustHack

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

 

В интернете нашел еще такое решение,

вместо вызова конструктора

else //not too long,	
		String(s);

использовать уже непосредственно саму функцию того конструктора

else //not too long,	
		strcpy_s(str, s);

 

Изменено пользователем Antonshka
Ссылка на комментарий
Поделиться на другие сайты

  В 25.04.2019 в 05:17, Antonshka сказал:

Непонятно почему в этом скрипте вызывается конструктор базового класса из тела конструктора производного класса.

Показать  

 

Возможно использовалась старая спецификация языка, которая позволяла это делать. Это надо смотреть по какой версии писалась книга.

Хотя код достаточно странный из примера и некоторые куски кода вообще не понятно как должны работать.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.