Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Apr 21, 2019 3:34 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 2 posts ] 
Author Message
PostPosted: Sat Jan 24, 2015 9:34 pm 
Offline

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


mstring.h
Spoiler: Show
Code:
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
Spoiler: Show
Code:
#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;
}


Как можно использовать:
Code:
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

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


Top
   
PostPosted: Sun Jan 25, 2015 1:53 pm 
Offline
User avatar

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 2 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited