PDA

Показать полную графическую версию : string


farik
02-03-2006, 06:15
Есть класс string ,помогите дописать конструктор по умолчанию, позволяющий создать строку длиной 80 символов вот код:


#include <string.h>
#include <stdio.h>
class String {
public:
~String();
String();
String(char*);
const String& operator= (char*);
const String& operator+ (char*);
operator char*();
char* GetBuffer();
private:
char* buffer;
};
String::~String(){ delete buffer; }
String::String() { buffer = 0; }
String::String(char* string)
{
buffer = new char[strlen(string)+1];
strcpy(buffer, string);
}
char* String::GetBuffer() { return buffer; }
String::operator char*() { return buffer; }
const String& String::operator= (char* string)
{
delete buffer;
buffer = new char[strlen(string)+1];
strcpy(buffer,string);
return *this;
}
const String& String::operator+ (char* string)
{
int len = strlen(buffer)+1;
char* old_buff = new char[len];
strcpy(old_buff,buffer);
delete buffer;

buffer = new char[len + strlen(string) + 1];
strcpy(buffer,old_buff);
strcat(buffer,string);
delete old_buff;
return *this;
}
int main()
{
String string;
string="I Love";
string = string + " C++";
printf("%s",string);
scanf("x");
return 0;
}

vadimiron
02-03-2006, 10:37
String::String() { buffer = 0; }
Это и есть конструктор
Чтобы создать определённого размера, то надо взять другую часть этого кода, а именно
buffer = new char[80];

pva
07-03-2006, 12:22
Несколько замечаний по поводу стиля:

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;
}




© OSzone.net 2001-2012