Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 09.02.2014, 23:50   #1
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
Лампочка конструктор для коллекции

Код:
#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;
 
}
Код:
#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;
}
Код:
#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. Мне нужно (вот вызов Collection t(c2)) в коллекцию t скопировать c2, не использую новые объекты базового класса Disc, т.е. k1,k2,k3,k4 оставить без изменений.
Я так понимаю что мне нужно что-то делать с адресами объектов которые хранятся в с2, может создать массив для t, и в этот массив занести адреса объектов из **items.
Хелп: мысли, решения, соображения)
Lers вне форума   Ответить с цитированием
Старый 10.02.2014, 00:27   #2
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Код:
#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();
};
Код:
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);
};
хидеры....
Lers вне форума   Ответить с цитированием
Старый 10.02.2014, 00:52   #3
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

уже решил, тему можно закрывать.
P.S. может кому-то интересно, вот констуктор

Код:
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 вне форума   Ответить с цитированием
Старый 10.02.2014, 12:04   #4
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,887
Репутация: 1915
По умолчанию

Наверно будет лучше если
Collection :: Collection (const Collection& x)

Наверно будет лучше если
items[i] = new Disc(x->items[i]);
waleri на форуме   Ответить с цитированием
Старый 11.02.2014, 01:07   #5
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Наверно будет лучше если
Collection :: Collection (const Collection& x)
Почему лучше по адресу &x?
Lers вне форума   Ответить с цитированием
Старый 11.02.2014, 20:09   #6
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Наверно будет лучше если
items[i] = new Disc(x->items[i]);
Так не работает, конструктора нету для такой записи
Lers вне форума   Ответить с цитированием
Старый 11.02.2014, 20:11   #7
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Код:
items[i] = new Disc;
        items[i]->sethours(x->items[i]->gethours());
        items[i]->setnamedisc(x->items[i]->getnamedisc());
Вопрос, можно ли это объединить в одну строчку?
например items[i]=x->items[i]; (так работает, но вылетит если я удалю какой-нибудь i-тый объект из первой коллекции).
Lers вне форума   Ответить с цитированием
Старый 11.02.2014, 20:39   #8
MaTBeu
Eclipse Foundation
Профессионал
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Адрес: Стокгольм
Сообщений: 2,623
Репутация: 1148
По умолчанию

Цитата:
Сообщение от Lers Посмотреть сообщение
Почему лучше по адресу &x?
Это не адрес, а константная ссылка. Константность гарантирует, что исходный объект в вашем методе/конструкторе не изменится.
MaTBeu вне форума   Ответить с цитированием
Старый 11.02.2014, 21:24   #9
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Это не адрес, а константная ссылка. Константность гарантирует, что исходный объект в вашем методе/конструкторе не изменится.
Спасибо, не подскажите как объединить 3 строчки из пред.поста в 1 строчку?
Lers вне форума   Ответить с цитированием
Старый 11.02.2014, 21:49   #10
Lers
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 33
Репутация: 10
По умолчанию

Вопрос решил, вот так
Код:
items[i]=new Disc(*x->items[i]);
Lers вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор для анонимной структуры/класса 220Volt Общие вопросы C/C++ 2 12.12.2013 20:46
Конструктор для инициализации элемента данных monro86 Visual C++ 1 29.03.2012 18:52
Шаблоны. Создать отедльный конструктор копирования для типов, другой для классов TwiX Общие вопросы C/C++ 3 19.09.2010 16:29
Конструктор для изменения размерности массива and277 Общие вопросы C/C++ 2 10.08.2009 20:47
Как определить “Index” для коллекции “Words”? Mack Sim Microsoft Office Word 2 22.04.2009 18:10


20:58.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.