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

Создание класса-агрегата объектов - C++

Восстановить пароль Регистрация
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 406
24.04.2014, 00:38     Создание класса-агрегата объектов #1
Есть класс TString являющийся агрегатом объектов класса TSymb
Как написать конструктор TString при этом по его параметру-входной строке надо создать и экземпляры TSymb[i]
и обойтись без всяких vector а с динамическим массивом TSymb.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TSymb 
{...}
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
  TSymb **smb; 
  public:
     int n;//кол-во
     TString(char *ref);
     ~TString(void);
         void setC(char c);
};
 
TString::TString(char *ref)
{  char c;
    n=strlen(ref);  
   *smb=new TSymb[n];
 for (int i=0;i<n;i++){
   c=ref[i];
   smb[i]=new TSymb(c);
                       }
}
void TSymb::setC(char c)
{ch=c;}
В клвсс TSymb добавлен конструктор по умолчанию - пустой. По синтаксису код проходит, но валится на
*smb=new TSymb [n]; надо как-то в нем перейти к указателям TSymb??

Добавлено через 46 минут
Естественно удаление оператора *smb=new TSymb[n]; даст ошибку памяти ниже на
smb[i]=new TSymb(c);

Добавлено через 9 часов 12 минут
Все.Наконец получилось агрегирование по значениям (композиция).
Единственный вариант при композиции –выделять память для n объектов TSymb с помощью
smb=new TSymb [n]; при этом неявно вызывается конструктор без параметров. TSymb() который надо добавить в класс TSymb.Вариант использования с new конструктора с параметрами не проходит. Чтобы все таки после создания объектов конструктором без парамеров установить нужные значения символа, добавим метод обновления void setC(char c); класс TSymb
C++
1
2
3
4
5
6
7
8
9
10
11
TString::TString(char *ref)
{  char c;
    n=strlen(ref);  
    smb=new TSymb [n];
    for (int i=0;i<n;i++)
     {c=ref[i]; smb[i].setC(c);}
}
TString::~TString(void) 
 {   for(int i=0;i<n;i++)
       smb[i].~TSymb();
 }
2 способ (агрегирование по ссылкам-наполнение)
Здесь удобно использовать vector из STL
C++
1
2
3
4
5
6
7
8
9
10
TString::TString(char *ref)
{  char c;
    n=strlen(ref);
    for (int i=0;i<n;i++){
     c=ref[i];
     str.push_back(TSymb(c));
    }
}
TString::~TString() 
{  str.clear();}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 00:38     Создание класса-агрегата объектов
Посмотрите здесь:

Создание Массива Объектов класса C++
C++ Создание и разрушение объектов класса, исследование вызовов конструкторов и деструкторов
Создание нескольких объектов класса и их сохранение (Нужен пример) C++
Создание двух объектов класса Employee C++
C++ Создание объектов класса и обращение к ним
C++ Создание массива объектов класса
Создание списка объектов собственного класса (SQL) C++
Автоматическое создание объектов класса C++
C++ Создание объектов класса пользователем
C++ Создание массива объектов класса
C++ Создание объектов класса
Создание класса абстрактных объектов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,896
Записей в блоге: 3
24.04.2014, 01:40     Создание класса-агрегата объектов #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
eugrita, вот это указатель на указатель/массив указателей
Цитата Сообщение от eugrita Посмотреть сообщение
TSymb **smb;
То есть под указатель получаемый его разыменованием память не выделена и:
C++
1
 *smb=new TSymb[n];
нехорошо. У Вас по смыслу, скорее всего нужно в классе объявить не TSymb **smb, a TSymb *smb
Кроме того, strlen () не учитывает терминатор, поэтому
C++
1
2
3
n=strlen(ref)+1;
//и
smb=new TSymb [n];
Опять же не видя класса TSymb трудно сказать наверняка.
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 406
24.04.2014, 02:03  [ТС]     Создание класса-агрегата объектов #3
да все правильно
C++
1
2
3
4
5
6
7
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
  TSymb *smb; 
.....
}
...
smb=new TSymb [n];
я к этому пришел после провала попыток с двойным указателем.
Спасибо за n=strlen(ref)+1;
Yandex
Объявления
24.04.2014, 02:03     Создание класса-агрегата объектов
Ответ Создать тему
Опции темы

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