Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на WinApi, C++Builder, Visual C++


Информационный Канал Subscribe.Ru


Выпуск № 14-2003 BCBDEV.BY.RU

Здравствуйте уважаемые подписчики!

Перед вами очередной выпуск рассылки "Программирование на WinApi"

Строки изменяющие свой размер динамически
Иногда требуется менять содержимое строки динамически.
Например, для того, чтобы добавить в строку подстроку. Ниже приведен класс такой строки.
Если вас интересует более продвинутый класс для работы со строками, могу поделиться. Этот класс я как-то на досуге выдрал из MFC, попутно убрав многие зависимости от самой библиотеки. Работает этот класс, я бы сказал, на порядок лучше, чем AnsiString в C++Builder. По желанию его можно доработать до полной совместимости со старым вариантом CString из MFC и с AnsiString из VCL. Но что-то я отвлекся, понадобится, пишите с темой TJString.
Собственно то, с чего началась рассылка:
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <iostream.h>

class CStr
{
private:
 char *pData;
public:
 CStr();
 CStr(char *str);
 CStr(CStr& str);
 const char *getData();
 void operator += (char *str);
 void operator = (char *str);
 ~CStr();
};

CStr::CStr()
{
 pData = NULL;
}

CStr::CStr(char *str)
{
 pData = new char [strlen(str)+1];
 if (pData == NULL) return;
 if (!strlen(str)) strcpy(pData, "\0");
 else strcpy(pData, str);
}

CStr::CStr(CStr& str)
{
 if (this == &str) return;
 pData = new char [strlen(str.getData())+1];
 if (pData == NULL) return;
 if (!strlen(str.getData())) strcpy(pData, "\0");
 else strcpy(pData, str.getData());
}

const char *CStr::getData()
{
 return((const char *)pData);
}

void CStr::operator += (char *str)
{
 if (pData)
 {
  char *tmp = new char [strlen(str) + strlen(pData)+1];
  if (tmp == NULL)
  {
   delete []pData;
   pData = NULL;
   return;
  }
  strcpy(tmp, pData);
  strcat(tmp, str);
  if (pData != NULL) delete []pData;
  pData = tmp;
 }
 else
 {
  pData = new char[strlen(str)+1];
  if (pData == NULL) return;
  if (!strlen(str)) strcpy(pData, "\0");
  else strcpy(pData, str);
  strcpy(pData, str);
 }
}

void CStr::operator = (char *str)
{
 if (pData) delete []pData;
 pData = new char [strlen(str)+1];
 if (!strlen(str)) strcpy(pData, "\0");
 else strcpy(pData, str);
}

CStr::~CStr()
{
 if (pData)
 {
  delete []pData;
  pData = NULL;
 }
}

Удачи Вам в Ваших делах Куковинец Андрей aka Juggernaut

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное