Форум программистов, компьютерный форум CyberForum.ru

Аналогия string - C++

Восстановить пароль Регистрация
 
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 22:41     Аналогия string #1
Здравствуйте.
Получил задание реализовать класс string.
Столкнулся с проблемой, при перегрузке оператора вывода в поток <<.
Если строка не пустая, то я в поток помещаю строку. Но как мне добиться такого же результата, как в string, когда строку пуста?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:43     Аналогия string #2
ничего не пишите в поток
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 22:48  [ТС]     Аналогия string #3
Не получается: возникает ошибка на этапе выполнения.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:51     Аналогия string #4
вы бы код привели. а то получается, что вы ничего не делаете и у вас от этого ошибки в рантайме возникают.
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 22:55  [ТС]     Аналогия string #5
Согласен, вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class String
{
private:
    char* str;
    ............
public:
    String();
    String (const char*);
    String (String&);
    ~String();
    friend ostream& operator << (ostream&, const String&);
};
ostream& operator << (ostream& out, const String &s)
{
    if (s.str)
           out<<s.str;
    return out;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:59     Аналогия string #6
код оператора корректный. конструкторы покажите. похоже там у вас не инициализируется
указатель str нулем в дефолтном конструкторе. да и остальные до кучи тоже
не плохо бы увидеть. и оператора = у вас нет.
в общем все показывайте.
конструктор копирования кстати лучше бы принимал константную ссылку на строку.
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 23:04  [ТС]     Аналогия string #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class String
{
private:
    char* str;
    int copy;
    String *father;
    void Clone (String&);
    void Erase();
public:
    String();
    String (const char*);
    String (String&);
    ~String();
    int len() const;
    friend ostream& operator << (ostream&, const String&);
};
String::String (): str(NULL), copy(0), father(NULL) {};
String::String (const char *s)
{
    father=NULL;
    copy=0;
    str=new char [strlen(s)+1];
    strcpy(str, s);
}
void String::Clone(String& s2)
{
    str=NULL;
    if (s2.father)
    {
        father=s2.father;
        s2.father->copy++;
    }
    else
    {
        father=&s2;
        s2.copy++;
    }
}
String::String(String& s2)
{Clone(s2);}
void String::Erase()
{
    if (str)
        delete [] str;
    str=NULL;
    father=NULL;
    copy=0;
}
String::~String()
{Erase();}
int String::len() const
{
    int n;
    if (!father)
        if (str)
            n=strlen(str);
        else
            n=0;
    else
        if (father->str)
            n=strlen(father->str);
        else
            n=0;
    return n;
}
ostream& operator << (ostream& out, const String &s)
{
    if (!s.father)
        if (s.str)
            out<<s.str;
    else
        if (s.father->str)
            out<<s.str;
    return out;
}
Класс еще не дописал. Тут я реализую механизм, что при копировании строк не создается новой, а у базовой увеличивается показатель копий на 1. В то же время строку, в которую скопировали, на самом деле пуста, но ее указатель ссылается на базовую строку.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 23:20     Аналогия string #8
охренеть вы даете. замутили премудрости и спрашиваете почему не работает.
раз у вас логически строка пустая, то вот такая ее проверка на пустоту неверна:
C++
1
 if (s.str)
потому что
на самом деле пуста, но ее указатель ссылается на базовую строку
раз так - пропишите правильную проверку на то, что строка пустая.
разбираться в ваших подсчетах ссылок как-то не очень хочется.
если ваша функция len работает правильно то
if (s.len() != 0) - может и проканает.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,577
26.02.2014, 23:25     Аналогия string #9
Небольшой совет в копилку: функция Erase должна учитывать ваш подсчет ссылок. Иначе вы инвалидируете остальные ссылки (скорее всего при обращении к ним программа рухнет).
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 23:25  [ТС]     Аналогия string #10
Поясните, пожалуйста, в чем ошибка проверки указателя на строку?
C++
1
if (s.str)
Ведь в конструкторе str инициализируется нулем.
А в последствии, если там что-то появится, то это и будет выведено.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,577
26.02.2014, 23:31     Аналогия string #11
Цитата Сообщение от HenryDukart Посмотреть сообщение
Поясните, пожалуйста, в чем ошибка проверки указателя на строку?
ИМХО, само по себе это не ошибка.
Мне кажется вы несколько не готовы реализовывать строку с подсчетом ссылок, может быть сперва обычную копирующую реализовать? А потом уже модифицировать ее под подсчет. Чтобы с более цельной картиной работать.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 23:38     Аналогия string #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
такой код должен отработать корректно:
C++
1
2
String str;
std::cout << "string is '" << str << "'" << std::endl;
но если он чуть сложнее и в строку что-то писали и потом потерли, но
как вы написали str на что-то указывает, то значит условие if (s.str) отрабатывает
и выполняется out<<s.str;
т.е. строка логически пустая, но внутренние данные на что-то указывают, вот и выводится
то, на что они указывают или падает если они указывают на хрень какую-то. значит проверять на то, что строка пустая нужно как-то по другому. или вы где-то не обнуляете этот указатель.

Добавлено через 2 минуты
присоединяюсь к DrOffset
вам точно нужна строка подсчетом ссылок, copy on write и прочими прелестями?
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
26.02.2014, 23:48  [ТС]     Аналогия string #13
Запись в строку я еще не реализовывал.
Ваши замечание учту, спасибо.
Но все же, как вернуть пустой поток?
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,577
26.02.2014, 23:53     Аналогия string #14
Цитата Сообщение от HenryDukart Посмотреть сообщение
Но все же, как вернуть пустой поток?
Просто ничего не писать туда. С этой точки зрения код оператора у вас корректный. Мы потому и начали смотреть остальной код, ибо есть подозрение, что падает не из-за конкретно оператора, а по другим причинам.
HenryDukart
 Аватар для HenryDukart
99 / 99 / 27
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
27.02.2014, 00:12  [ТС]     Аналогия string #15
Нашел проблему. Она заключалась в том, что при удалении некоторых условий при выводе,
я забыл расставить {} так как теперь они были необходимы.
Вот старый код:
C++
1
2
3
4
5
6
if (!s.father)
        if (s.str)
            out<<s.str;
    else
        if (s.father->str)
            out<<s.str;
Вот тут-то я не досмотрел, что else относится не к
C++
1
if (!s.father)
а к
C++
1
if (s.str)
Проблема решена.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2014, 00:24     Аналогия string
Еще ссылки по теме:

C++ Идентификатор string не определён при наличии #include <string>
C++ Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,577
27.02.2014, 00:24     Аналогия string #16
Цитата Сообщение от HenryDukart Посмотреть сообщение
я забыл расставить {}
Ваше дело слушать или нет. Но я достаточно давно для себя определил, что лучше скобки ставить всегда, это помогает избавиться от многих проблем связанными с невнимательностью. Например вот, классика:
C++
1
2
3
if(somevar)
                                                                                                                                                           ;
    dosomething();
Yandex
Объявления
27.02.2014, 00:24     Аналогия string
Ответ Создать тему
Опции темы

Текущее время: 10:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru