Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: string
Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Несколько замечаний по поводу стиля:
Код: Выделить весь код
String::String(char*);
// вообще говоря, тогда String str("I Love"); не должно откомпилироваться.
// думаю, что вы компилируете с помощью Borland C++ Builder
// лучше String::String(const char*) - вы ведь строку не меняете.

const String& String::operator=(char*)
// как тогда сделать (str="abc") += "def"?
// лучше const char*

// где оператор копирования?
// по умолчанию: String::String(const String& str) : buffer(str.buffer) {}
// что, конечно же, ошибочно (попробуйте удалить строку и её копию)

const String& String::operator+(char*)
// как вы себе представляете действие c = a + b? (у вас c = a+=b)
// лучше const char*

// учитывая все ошибки, предлагаю переписать класс следующим образом
// я приведу описание класса, а вы можете раскрыть содержимое сами:

class String
{
    char* fbuffer;
public:
    String();
    String(const char* data);
    String(const char* data, int size);
    String(const char init_symbol, int size=80);
    String(const String&);
    ~String();
    String& operator+=(const String&);
    String& operator=(const String&);
    friend String operator+(const String&,const String&);
    int size() const;
    const char* c_str() const; // getBuffer()
    char& operator[](int n) {return fbuffer[n];}
    char& at(int n) throw(std::out_of_range);
    const char& operator[](int n) const {return fbuffer[n];}
    const char& at(int n) const throw(std::out_of_range);
};
После того, как вы поиграетесь с такой строкой, поймёте, что не смотря на удобство обращения, ей не хватает производительности при операциях сложения. Чтобы увеличить производительность, вы сделаете так:
Код: Выделить весь код
class String
{
     char* fbuffer;
     unsigned fcapacity; // current buffer size
     unsigned fsize; // current string size, < buffer size; fbuffer[fsize] = 0
public:
    ...
}
Затем захочется поиграть с заменой операторов new/delete на более эффективные, заменой операций сравнения символов на свои (например case-insensitive). Вконце получится шаблон std::basic_string<typename charT, typename charTraits, typename Allocator>.
typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string; // обычная строка
typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > wstring; // обычная уникодовская строка
Код: Выделить весь код
#include <string>
#include <iostream>

int main()
{
    // классы стандартной библиотеки обладают:
    // высокой производительностью,
    // устойчивостью к исключениям,
    // гибкостью в конструировании,
    // строго соответствуют правилам C++.

    std::string string = "I Love";
    std::cout << (string+=" C++") << "\n";

    std::string s(80, '?');
    std::cout << s << "\n";
    return 0;
}

Отправлено: 12:22, 07-03-2006 | #3

Название темы: string