Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 10:17   #1
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
Сообщение C++ проблема с конструктором базового класса

Код:
class String
	{
		protected:
			enum {SIZE = 10};
			char str[SIZE];
		public:
			String() { strcpy(str, "");}
			String(char arg[]) { strcpy(str, arg);}
	};

class PString: public String
	{
		public:
			PString(): String() {}
			PString(char arg[])
				{
					if(strlen(arg) > (SIZE-1))
						{
							int i;
							for(i = 0; i < (SIZE-1); i++)
									str[i] = arg[i];
							str[i] = '\0';
						}
					else 
						{
							//String(arg);//ничего не записывает в str
							
						}
						
				}
	};
Подскажите, почему конструктор базового класса String, при вызове из конструктора PString не инициализирует str нужным значением?

Последний раз редактировалось halcyon; 07.05.2012 в 10:21.
halcyon вне форума Ответить с цитированием
Старый 07.05.2012, 15:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,715
По умолчанию

Код:
//String(arg);//ничего не записывает в str
Записывет, но не в тот который вы думаете. Посмотрите в книге, как задать параетры конструктору базового класса.
p51x вне форума Ответить с цитированием
Старый 08.05.2012, 13:56   #3
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Конструктору БК из производного мы передаем параметры так:
Код:
class PString: public String
       {
             public:
                  PString(char arg[]): String(arg) {//.....
                         //.....}
       };
Но я все равно не понимаю почему, String(arg) не работает, после else
halcyon вне форума Ответить с цитированием
Старый 08.05.2012, 16:43   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,715
По умолчанию

Еще раз - работает, но не так как вам хочется. А конструктор для базового уже отработал в вашем "случае после елса".
p51x вне форума Ответить с цитированием
Старый 08.05.2012, 20:32   #5
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

допустим потом в main():
Код:
 int main()
      {
            PString s("qwe"); //короткая строка которая отправляется в конструктор БК после else
            s.show(); // String::show() { cout<<str<<endl;
       }
show() выдает пустоту.
А как же он тогда работает? Вы можете мне объяснить?
halcyon вне форума Ответить с цитированием
Старый 08.05.2012, 21:34   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,715
По умолчанию

Я вам уже какой раз повторяю - Именно так как написано. Но не так, как вам хотелось бы.

Код:
 PString s("qwe"); //короткая строка которая отправляется в конструктор БК после else
Выделена память под PString
Вызван конструктор базового класса String(), т.к. не указано иного
Вызыватеся конструктор PString
- "если" создаем объект String, вызвав конструктор String(char arg[])
- уничтожаем созданный String, т.к. вышли из области видимости
p51x вне форума Ответить с цитированием
Старый 09.05.2012, 08:56   #7
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

не понимаю, почему все-таки вызывается не String(char arg[]), наверное упоротый.
И вообще зачем в книге привели этот пример, выводит мусор, а не строку...
я в полном заблуждении.
halcyon вне форума Ответить с цитированием
Старый 09.05.2012, 10:05   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,715
По умолчанию

Цитата:
не понимаю, почему все-таки вызывается не String(char arg[]), наверное упоротый.
Код:
PString(char arg[])
				{
Вы видите здесь, что надо вызвать String(char arg[])? Нет? Вот и компилятор тоже, а телепатией он не обладает пока...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инициализация переменных базового класса в дочернем классе t2skler Общие вопросы C/C++ 5 18.07.2022 20:53
Создание базового класса ScrappyCoco Общие вопросы C/C++ 3 24.04.2012 15:51
Функция базового класса вызывает критическую ошибку при вызове для класса-потомка Archet Общие вопросы C/C++ 7 17.01.2012 20:17
Как обратиться к полям базового класса? Azartov Общие вопросы C/C++ 13 03.07.2011 20:32
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24