Форум программистов, компьютерный форум CyberForum.ru

Конструктор с параметром по умолчанию - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.69
Altair5
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 11
29.02.2012, 17:36     Конструктор с параметром по умолчанию #1
Здравствуйте, знаю, что здесь про конструкторы много говорили, но я не смог решить свою проблему поэтому обращаюсь (хотя мне кажется что проблема пустяковая).
Нам дали задание создать 2 конструктора в объявлении класса:
Первый в параметрах принимает значения полей класса, причем числовые поля задаются по умолчанию.
Второй не принимает значений, а просто запрашивает ввод с клавиатуры.
В демонстрационной программе необходимо динамически создать 3 файла с помошью функции new
Первый - конструктор со всеми параметрами,
Второй - конструктор без числовых параметров (кроме номера объекта)
Третий -конструктор без параметров.

Вот заголовок с объявлениями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef Givotnie
#define Givotnie
#include "stdio.h";
class CGivotnie
{  int nomer;
   char kl[5];
   char naimen[15];
   double ves;
 
public:
 CGivotnie(int n1,char *k,char *na,double v);
 CGivotnie();
 ~CGivotnie();
void PrintClass (int n);
void InitClass(int n);
void vvod_naim ();
void vivod_naim ();
void vvod_ves ();
void vivod_ves ();
void vvod_kl ();
void vivod_kl ();
};
#endif
Вот реализация:
C++
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "Givotnie.h";
CGivotnie::CGivotnie(int n1,char *k,char *na,double v = 45.0)
{printf("Создание нового объекта под номером %d\n",n1);
 nomer=n1;
 *naimen=*na;
 *kl=*k;
 ves=v;
}
CGivotnie::CGivotnie()
{printf("Создание нового объекта под номером ");
 scanf("%d",&nomer);
 vvod_naim();
 vvod_ves();
 vvod_kl();
}
 CGivotnie::~CGivotnie()
{printf("Вы удаляете объект со следующими параметрами\n");
 printf("Номер элемента %d\n",nomer);
 printf("Вес элемента %lf\n",ves);
 printf("Наименование элемента %s\n",naimen);
 printf("Класс элемента %s\n",kl);
}
 void CGivotnie :: InitClass (int n)
{nomer = n;
 vvod_ves();
 vvod_naim();
 vvod_kl();
}
void CGivotnie::PrintClass (int n)
{ printf("Номер = %d",nomer);
  vivod_ves();
  vivod_naim();
  vivod_kl();
}
void CGivotnie::vvod_ves ()
{printf("Введите вес \n");
scanf("%lf",&ves); getchar();
}
void CGivotnie::vvod_naim ()
{printf("Введите наименование\n");
 scanf("%6s",&naimen);
}
void CGivotnie::vvod_kl ()
{printf("Ввдите класс 5 букв (mleko, nasek itd)\n");
 scanf("%5s",&kl);}
void CGivotnie::vivod_ves()
{printf("Вес элемента = %3.2lf",ves);}
void CGivotnie :: vivod_naim()
{printf("Наименование элемента = %s",naimen);}
void CGivotnie :: vivod_kl ()
{printf("Класс элемента = %5s\n",kl);}
Вот демонстрационная программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Givotnie.h"
#include "stdio.h"
void main()
{ int n,i,k;
  char a;
 
CGivotnie *Anim= new CGivotnie(1,"mleko","volk",55);
CGivotnie *Anim2= new CGivotnie(1,"mleko","bear");
CGivotnie *Anim3= new CGivotnie();
 
delete Anim;
delete Anim2;
delete Anim3;
printf("Работа программы окончена");
}
При отладке компилятор ругается на 8 строку демонстрационной программы
error C2661: CGivotnie::CGivotnie: нет перегруженной функции, принимающей 3 аргументов
Может я не так понял использование параметров по умолчанию?

Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Serejke_qq
 Аватар для Serejke_qq
149 / 107 / 9
Регистрация: 06.07.2011
Сообщений: 224
Завершенные тесты: 2
29.02.2012, 17:41     Конструктор с параметром по умолчанию #2
собственно говоря ошибка говорит сама за себя..
конструктор с параметрами принимает 4 агрумента .. вот :
C++
1
CGivotnie(int n1,char *k,char *na,double v);
а вы передаёте 3 :
C++
1
CGivotnie *Anim2= new CGivotnie(1,"mleko","bear");
как вариант перегрузить конструктор для 3х аргументов в котором ваше v будет автоматически принимать стандартное значение..
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
29.02.2012, 17:52     Конструктор с параметром по умолчанию #3
Givotnie.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class CGivotnie
{  int nomer;
   char kl[5];
   char naimen[15];
   double ves;
 
public:
 CGivotnie(int n1,char *k,char *na,double v=45.0);
 CGivotnie();
 ~CGivotnie();
//...
};
#endif
Givotnie.cpp
C++
1
2
3
4
5
6
7
8
9
#include "Givotnie.h";
CGivotnie::CGivotnie(int n1,char *k,char *na,double v)
{printf("Создание нового объекта под номером %d\n",n1);
 nomer=n1;
 *naimen=*na;
 *kl=*k;
 ves=v;
//...
}
Добавлено через 2 минуты
Программа видит только "Givotnie.h" в котором конструктор с параметром по умолчанию неопределен, а
"Givotnie.ccp" не видит так как вы его не подключали
Altair5
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 11
29.02.2012, 18:54  [ТС]     Конструктор с параметром по умолчанию #4
Действительно, что-то я затупил)
Спасибо огромное!

Добавлено через 59 минут
Ещё одна проблема.
При работе, программа, когда записывает в поля значения из первого конструктора, сшивает имя класса и наименование.
А когда наименование вводится с клавиатуры, то его программа просто не выводит (это когда конструктор идет без параметров).
Я переделал в конструкторе с параметрами запись наименования и класса, а то в начальной версии программа выводила лишь первые символы.

вот реализация измененного конструктора:
C++
1
2
3
4
5
6
7
8
9
10
CGivotnie::CGivotnie(int n1, char *(k), char *(na),double v)
{int i;
 printf("\nSozdanie novogo obiekta pod nomerom %d\n",n1);
 nomer=n1;
 for(i=0;i<5;i++)
 *(kl+i)=*(k+i);
 for(i=0;i<15;i++)
 *(naimen+i)=*(na+i);
 ves=v;
}
Вложил скрин работы:
Миниатюры
Конструктор с параметром по умолчанию  
Yandex
Объявления
29.02.2012, 18:54     Конструктор с параметром по умолчанию
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru