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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 427
#1

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

24.04.2014, 00:38. Просмотров 443. Ответов 2
Метки нет (Все метки)

Есть класс 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++
class A{ A(string name){ } } int main(){ } Есть класс с конструктуром, я понимаю что чтобы создать новый объект...

Создание массива объектов класса - C++
Доброго времени суток! Хотела бы разобраться с вашей помощью в чем-таки состоит моя ошибка. //Создаю класс class TaleGreen { ...

Создание объектов класса пользователем - C++
К примеру простой класс: class Test { private: int year; public: void SetValue(int yr) { year = yr; ...

Автоматическое создание объектов класса - C++
Только начал знакомится с классами С++ и возник вопрос. Возможно есть более элегантное решение этой ситуации, но я пока делаю так, как...

Создание Массива Объектов класса - C++
Здравствуйте, такая вот проблемка возникла: нужно создать массив B объектов класса TGoods. И далее по определенному значению year...

Создание класса абстрактных объектов - C++
Добрый день/утро/вечер. Возник вопрос,скорее теоретического характера. Есть задание реализовать классы вектор и матрица абстрактных...

Создание/удаление объектов класса - C++
Имеется следующий код: cow.h #ifndef COW_H #define COW_H class Cow { private: char name; char * hobby;

Создание массива объектов класса - C++
Здравствуйте Подскажите пожалуйста как правилььно создать массив объектов класса, что бы не создавать промежуточный объект класса &quot;Rtd&quot;: ...

Создание массива объектов класса - C++
Создание массива объектов класса. E2451 Undefined symbol 'myZKH' По-разному уже пробовал-безуспешно. /* Создание...

Создание объектов класса и обращение к ним - C++
Можете , пожалуйста , помочь разобраться с след. записью ? MyClass* ob = new MyClass(); ob-&gt;Set(3); MyClass ob2 = *ob; ...

Создание двух объектов класса Employee - C++
Напишите программу с использованием класса Emloyee, два объекта класса Employee, устанавливает значения членов itsAge, itsYearOfService, и ...

Создание списка объектов собственного класса (SQL) - C++
очень нужно! объясните, пожалуйста, доходчиво, а лучше с примером, как создать список из объектов класса, к примеру, &quot;human&quot;, используя...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,344
Записей в блоге: 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
Сообщений: 427
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     Создание класса-агрегата объектов
Ответ Создать тему
Опции темы

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