Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: объект строка с массивом из объектов другого класса (символ)  (Прочитано 4022 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 25-05-2011 00:11 » 

Даны: 1)объект символ, умеющий печатать свое значение и отвечать на запрос о значении своего символьного поля.
2)Объект «строка», как массив из 15 объектов-символов, умеющий выводить на печать значение своих элементов,  удалять символ по номеру, удалять символ по значению, возвра-щать номер символа, начиная с которого  некоторая  подстрока или символ входят в строку.
реализация классов:
Код:
#include <iostream.h>
#include <string.h>
class TSymbol
{ private:
    char Ref;
  public:
TSymbol(char ref);
       // ~TSlovo(void) {  delete Ref;}
char GetCh(void);
void Print(void);
};
char TSymbol::GetCh(void)
{    return Ref;}
TSymbol::TSymbol(char ref)
{ Ref=ref;}
void TSymbol::Print(void)
{ cout<<Ref;}
class TString
{   private:
       TSymbol ** smb;
 public:
 void TString::Print(void)
 {
  for (int i=0;i<15;i++)
    smb[i]->Print();
 }
 TString::TString(char ref[15])
  {
    smb=new (TSymbol *);
   for (int i=0;i<15;i++)
     smb[i]=new TSymbol(ref[i]);
  }
};
В этой задаче по условию надо создать объект строка с массивом из объектов другого класса (символ)
Как я понимаю при этом класс TString при создании (в конструкторе) должен иметь внутри себя массив объектов TSymbol .
Поэтому конструктор класса TString одновременно пытается создать 15 объектов класса TSymbol. У меня это проходит
без ошибки только при коде
Код:
smb=new (TSymbol *);
   for (int i=0;i<15;i++)
     smb[i]=new TSymbol(ref[i]);
(было искушение 1 оператор заменить на smb=new (TSymbol **)[15] но  это на следующем операторе
Код:
smb[i]=new ...
валит программу )
 вариант выше  проходит. Но при вызове печати str.Print() в демо-проге вместо 1-х 3 символов идет мусор, остальные печатаются. В чем дело?
« Последнее редактирование: 25-05-2011 00:14 от eugrita » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 25-05-2011 04:33 » 

А зачем указатель на указатель?
Код:
TSymbol ** smb;

так помоему проще и правильней
Код: (C++)
TSymbol * smb;
smb = new TSymbol[15];
smb[i].Print();
или даже так, если размер фиксированный
Код: (C++)
TSymbol smb[15];
smb[i].Print();

« Последнее редактирование: 25-05-2011 04:36 от Антон (LogRus) » Записан

Странно всё это....
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 25-05-2011 07:35 » 

Если не рассматривать пока более правильный вариант Антона, то:

Код:
smb=new (TSymbol *);
что должен был делать этот код? И что он на самом деле делает?

И общий вопрос: ты хорошо понимаешь работу с указателями в данном случае, в целом?
« Последнее редактирование: 25-05-2011 07:38 от Вад » Записан
eugrita
Помогающий

ru
Offline Offline

« Ответ #3 : 27-05-2011 02:26 » 

Все разобрался - надо было вводить промежуточный указатель typedef TSymbol * pTSymbol;
вот работающий код
Код:
typedef TSymbol * pTSymbol;
class TString
{
private:
  pTSymbol * smb; char *p;
  int N;//кол-во символов
  char TXT[15];//текст строки
  void setTXT();
public:
 void TString::Print(void); //печать
 void TString::DelSymb(int n);//удаление символа по номеру
 void TString::DelSymb(char c);//удаление символа по значению
 int TString::FndSbstr(char *s);//поиск вхождения подстроки s длины k в строке
 TString::TString(char ref[15]); //конструктор
};
TString::TString(char ref[15])
  {
    smb=new pTSymbol[15]; N=15;
   for (int i=0;i<15;i++)
     smb[i]=new TSymbol(ref[i]);
  setTXT();
  }

Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 27-05-2011 17:14 » 

eugrita, зачем Вы используете указатель на указатель?
Вы понимаете разницу между "массив из 15 объектов-символов" и "массив указателей на указатели на объекты-символы"?
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines