Page 1 of 1

Класс string на C++

Posted: Sat Jan 24, 2015 9:34 pm
by Nikolai1
Написал что-то вроде класса string для Kolibri на C++. Буду использовать для своей библиотеки viewtopic.php?f=33&t=2896
Может кому-то ещё пригодится


mstring.h
Spoiler:

Code: Select all

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:

Code: Select all

#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: Select all

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++

Posted: Sun Jan 25, 2015 1:53 pm
by pascualle
Для избежания фрагментации памяти советую изначально алоциловать char* text некоторым значением памяти (string capacity) по умолчанию, например 32 байта.
В setString проверять, если новая строка больше текущей, увеличивать размер text. Тут есть разные подходы -- или размером новой строки, но кратным размеру memory aligment, или 2^n, или прогрессией. Если же новая строка меньше текущей -- использовать текущую. Важный момент -- размер text не уменьшается, разве что только в случае, если пользователь явно этого хочет и вызовет специальную функцию (что-то типа string::shrink_to_fit)