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

Написать конструктор - C++

Восстановить пароль Регистрация
 
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
09.02.2014, 23:21     Написать конструктор #1
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
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include "Collection.h"
 
void main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  Collection *c2=new Collection;
 
  Disc *k1=new Disc ("Математика",10);
  c2->additem(k1);
  Disc *k2=new Disc ("Физика",22);
  c2->additem(k2);
  Disc *k3=new Disc ("Экономика",17);
  c2->additem(k3);
  Disc *k4=new Disc ("Биология",39);
  c2->additem(k4);
 
  Collection t(c2);
  
 getch();
  delete c2;
 
}
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
52
53
54
55
56
57
58
59
60
61
62
63
#include <string.h>
#include <stdio.h>
#include "disc.h"
 
void Disc :: setnamedisc(char *s)
{
  strcpy(namedisc,s);
}
 
char* Disc :: getnamedisc()
{
  return namedisc;
}
 
void Disc :: sethours(int b)
{
  hours=b;
}
 
int Disc :: gethours()
{
  return hours;
}
 
void Disc :: getobject()
{
  fflush(stdin);
  printf("\nВведите название дисциплины -> ");
  gets(namedisc);
  printf("Введите кол-во часов -> ");
  scanf("%d",&hours);
}
 
void Disc :: putobject()
{
  printf("\nНазвание дисциплины: ");
  puts(namedisc);
  printf("Количество часов: %d\n",hours);
}
 
Disc :: Disc()
{
  namedisc[0]=0;
  hours=0;
}
 
Disc :: Disc(char *s, int h)
{
  strcpy(namedisc,s);
  hours=h;
}
 
Disc :: Disc(Disc &x)
{
  strcpy(namedisc,x.namedisc);
  hours=x.hours;
}
 
Disc :: Disc(char *s)
{
  strcpy(namedisc,s);
  hours=0;
}
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
52
53
54
55
56
57
58
59
60
61
#include <string.h>
#include <stdio.h>
#include "Collection.h"
 
 
Collection :: Collection (Collection *x)
{
// заготовка для конструктора
}
 
 
Collection::Collection()
{
  col=0;
  items=new Disc*[10];
}
 
Collection::~Collection()
{
  for (int i=0; i<col; i++)
   {
      delete items[i];
    }
  delete [] items;
}
 
void Collection::additem(Disc *x)
{
    items[col] = x;
    col++;
}
 
void Collection::delitem(int a)
{
    while(a<col)
    {
      items[a]=items[a+1];
      a++;
    }
    col--;
 
}
 
int Collection::getcount()
{
  return col;
}
 
Disc * Collection::getitem(int num)
{
    return items[num];
}
 
void Collection::putitems()
{
  for(int i = 0; i < col; i++)
   {
     items[i]->putobject();
   }
 
}
У меня есть коллекция объектов класса Disc, и эти объекты хранятся в **items.
Мне нужно
C++
1
Collection t(c2);
(вот это вызов), в объект коллекции t скопировать c2, не использую новые объекты базового класса Disc, т.е. k1,k2,k3,k4 оставить без изменений.
Я так понимаю что мне нужно что-то делать с адресами объектов которые хранятся в с2, может создать массив для t, и в этот массив занести адреса объектов из **items.
Хелп: мысли, решения, соображения)

Добавлено через 5 часов 50 минут
ап хелп
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
09.02.2014, 23:54  [ТС]     Написать конструктор #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Disc.h"
class  Collection
{
  int col;
  Disc ** items;
  public:
    Collection(Collection *x);
    Collection();
    ~Collection();
    void additem(Disc *);
    void delitem(int);
    int getcount();     
    Disc * getitem(int);
    void putitems();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Disc
{
  private:
  char namedisc[20];
  int hours;
  
  public:
  void setnamedisc (char* s);
  char* getnamedisc();
  void sethours (int b);
  int gethours();
  void getobject();
  void putobject();
  Disc();
  Disc(char *s,int h);
  Disc(Disc &x);
  Disc(char *s);
};
Рассекречено
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
10.02.2014, 00:26     Написать конструктор #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Lers, наверное как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Collection :: Collection (Collection *x)
{
    // заготовка для конструктора
    col = x->col;
    items = new Disc *[col];
    for (int i = 0; i < col; ++i)
    {
        items[i] = new Disc;
        items[i]->sethours(x->items[i]->gethours());
        items[i]->setnamedisc(x->items[i]->getnamedisc());
    }
}
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
10.02.2014, 00:32  [ТС]     Написать конструктор #4
C++
1
col = x->col;
Не совсем понимаю, вот это для чего? Col у меня считает кол-во объектов в коллекции, т.е. до этого конструктора в col=4; а после вызова этого конструктора значение измениться

Добавлено через 1 минуту
ааа, все я понял
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
10.02.2014, 00:36     Написать конструктор #5
col = 4 в объекте, на который указывает х (х - это формальный параметр, а реально передается адрес с2).
а в вашем объекте (t) - поле col еще не инициализировано.
Поетому и копируем значение из х (фактически из объекта, на который указывает с2) в новый объект (t).
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
10.02.2014, 00:49  [ТС]     Написать конструктор #6
C++
1
2
3
items[i] = new Disc;
        items[i]->sethours(x->items[i]->gethours());
        items[i]->setnamedisc(x->items[i]->getnamedisc());
Можно вопрос, зачем мы для i выделяем память? разве не вызывается каждый раз конструктор базового класса Disc()?

Добавлено через 4 минуты
т.е. вместо
C++
1
items[i] = new Disc;
можно же написать так, чтобы не вызывать каждый раз конструктор базового класса?
C++
1
items=new Disc*[col];
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
11.02.2014, 21:49  [ТС]     Написать конструктор #7
C++
1
2
3
items[i] = new Disc;
        items[i]->sethours(x->items[i]->gethours());
        items[i]->setnamedisc(x->items[i]->getnamedisc());
Вопрос, можно ли это объединить в одну строчку?
например items[i]=x->items[i]; (так работает, но вылетит если я удалю какой-нибудь i-тый объект из первой коллекции).

Добавлено через 1 час 25 минут
думал сделать так items[i]=new Disc(x->items[i]); но у меня нет конструктора для такой записи.

P.S. up help

Добавлено через 9 минут
Вопрос решил вот так
C++
1
items[i]=new Disc(*x->items[i]);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2014, 01:38     Написать конструктор
Еще ссылки по теме:

C++ Как написать конструктор для класса, в котором содержится структура?
Как написать конструкторы копирования, инициализации и конструктор без аргументов? C++
C++ Как написать конструктор!?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
12.02.2014, 01:38     Написать конструктор #8
Цитата Сообщение от Lers Посмотреть сообщение
т.е. вместо
C++
1
items[i] = new Disc;
можно же написать так, чтобы не вызывать каждый раз конструктор базового класса?
C++
1
items=new Disc*[col];
Ну в интерфейсе написано:
C++
1
Disc ** items;
В принципе может и логичней, что бы просто поместить в класс Collection просто массив дисков:
C++
1
Disc * items;
, но тогда, например при добавлении функции сортировки нужно будет в этой функции менять местами сами объекты (при условии наявности перегруженного = для Disc, т.е. копируются полностью все поля объектов):
C++
1
2
3
4
5
6
7
if(strcmp(item[i].getdiskname(), item[i+1].getdiskname())
{
Disc tmp;
tmp = item[i];
item[i] = item[i+1];
item[i+1] = tmp;
}
, а так можно работать с указателями (по идее быстрее):

C++
1
2
3
4
5
6
7
if(strcmp(item[i]->getdiskname(), item[i+1]->getdiskname())
{
Disc *tmp;
tmp = item[i];
item[i] = item[i+1];
item[i+1] = tmp;
}


Возможно, я ошибаюсь, и более знающие подскажут...

Цитата Сообщение от Lers Посмотреть сообщение
Вопрос, можно ли это объединить в одну строчку?
да, думаю ваше решение компактней
Yandex
Объявления
12.02.2014, 01:38     Написать конструктор
Ответ Создать тему
Опции темы

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