Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср дек 13, 2017 4:35 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 2 сообщения ] 
Автор Сообщение
 Заголовок сообщения: Класс string на C++
СообщениеДобавлено: Сб янв 24, 2015 9:34 pm 
Не в сети

Зарегистрирован: Сб окт 11, 2014 6:06 pm
Сообщения: 67
Написал что-то вроде класса string для Kolibri на C++. Буду использовать для своей библиотеки viewtopic.php?f=33&t=2896
Может кому-то ещё пригодится


mstring.h
Спойлер: Показать
Код:
class mstring {
public:
   void setString(const char*);
   void addToString(const char*);

   void operator+=(const char* str);
   void operator+=(mstring& str);

    operator char*() const {
        return this->text;
    }

   mstring& operator=(const char* str);
   mstring& operator=(mstring& str);

   char* getString();

   mstring();
   mstring(char* str);
   ~mstring();
private:
   char* text;
};


mstring.cpp
Спойлер: Показать
Код:
#include "mstring.h"
#include "string.h"

mstring::mstring() : text(NULL) {

}

mstring::mstring(char* str) {
   this->setString(str);
}

void mstring::setString(const char* txt) {
   text = new char[strlen(txt)+1];
   strcpy(text, txt);
}

void mstring::operator+=(const char* str) {
   this->addToString(str);
}

void mstring::operator+=(mstring& str) {
   this->addToString(str.getString());
}

mstring& mstring::operator=(const char* str) {
   this->setString(str);
   return *this;
}

mstring& mstring::operator=(mstring& str) {
   this->setString(str.getString());
   return *this;
}

void mstring::addToString(const char* txt) {
   // Определяем длину новой строки
   int len = strlen(text)+strlen(txt)+1;

   // Копируем существующую строку во временный массив
   char* temp = new char[len];
   strcpy(temp, text);
   // Создаём новую строку
   text = new char[len];

   // Соединяем старую строку с новой
   strcpy(text, temp);
   strcat(text, txt);

   // Удаляём временную строку
   delete[] temp;
}

char* mstring::getString() {
   return text;
}

mstring::~mstring() {
   delete[] text;
}


Как можно использовать:
Код:
mstring str("My name is Nikolai.");
str += "Hello";
str += ", world!";
str += "Test!!!!";
// Строка: "My name is Nikolai. Hello, world! Test!!!"
str = "I am a programmer!!!";
// Строка: "I am a programmer!!!"

mstring str2;
str2 = "I learn PHP and C++!";
str = str2;
// Строка: "I learn PHP and C++!"

(char*)str; // Преобразование в тип char

_________________
Чудеса случаются! Это вам любой программист скажет! :)


Вернуться к началу
 Заголовок сообщения: Re: Класс string на C++
СообщениеДобавлено: Вс янв 25, 2015 1:53 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб июл 05, 2014 11:15 am
Сообщения: 87
Для избежания фрагментации памяти советую изначально алоциловать char* text некоторым значением памяти (string capacity) по умолчанию, например 32 байта.
В setString проверять, если новая строка больше текущей, увеличивать размер text. Тут есть разные подходы -- или размером новой строки, но кратным размеру memory aligment, или 2^n, или прогрессией. Если же новая строка меньше текущей -- использовать текущую. Важный момент -- размер text не уменьшается, разве что только в случае, если пользователь явно этого хочет и вызовет специальную функцию (что-то типа string::shrink_to_fit)


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 2 сообщения ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB