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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » string

Ответить
Настройки темы
string

Новый участник


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

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


Есть класс 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;
}

Отправлено: 06:15, 02-03-2006

 

Аватара для vadimiron

Ветеран


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

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


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

-------
Fortes fortuna adiuvat


Отправлено: 10:37, 02-03-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » string

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - перевод String to PAnsiChar (Запуск других приложений) TOOX Программирование и базы данных 4 21-05-2010 12:51
PowerShell - [блог] Регулярные выражения – Select-String Xaegr Скриптовые языки администрирования Windows 0 28-12-2009 18:30
string farik Программирование и базы данных 4 12-01-2006 13:11
public static void main (String args[]){ ReFleX Программирование и базы данных 1 19-09-2004 15:34
Класс string в MS Visual C++ 6.0 studentrsu Программирование и базы данных 1 22-03-2004 10:20




 
Переход