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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
#1

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

26.02.2014, 22:41. Просмотров 396. Ответов 15
Метки нет (Все метки)

Здравствуйте.
Получил задание реализовать класс string.
Столкнулся с проблемой, при перегрузке оператора вывода в поток <<.
Если строка не пустая, то я в поток помещаю строку. Но как мне добиться такого же результата, как в string, когда строку пуста?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2014, 22:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Аналогия string (C++):

Аналогия функции - C++
Подскажите на языке C++ аналогию функции которая на языке pascal-я выглядит таким образом repeat ... until=...

Аналогия ввода пароля в консоли - C++
Всем привет. Есть ли возможность сделать так, чтоб при вводе переменной, то что я ввожу отображалось звездочками(или другим символом)?

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()? - C++
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return NULL; } char** f_1 () { ...

Как используя C-String а потом и String class варьировать вывод? - C++
Дана задача: при вводе полного И.О.Ф. (в таком порядке) выводить Ф, И и О(только первую букву и .). И если О не задано - выводить только...

Как преобразовать char* в string и вывести переменную string на экран? - C++
for (int k = 0; k &lt; 10; k++) { int x = (int)rand() / RAND_MAX + rand() % 6 + 2; char *chars = new char; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:43 #2
ничего не пишите в поток
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
26.02.2014, 22:48  [ТС] #3
Не получается: возникает ошибка на этапе выполнения.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:51 #4
вы бы код привели. а то получается, что вы ничего не делаете и у вас от этого ошибки в рантайме возникают.
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
26.02.2014, 22:55  [ТС] #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;
}
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 22:59 #6
код оператора корректный. конструкторы покажите. похоже там у вас не инициализируется
указатель str нулем в дефолтном конструкторе. да и остальные до кучи тоже
не плохо бы увидеть. и оператора = у вас нет.
в общем все показывайте.
конструктор копирования кстати лучше бы принимал константную ссылку на строку.
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
26.02.2014, 23:04  [ТС] #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. В то же время строку, в которую скопировали, на самом деле пуста, но ее указатель ссылается на базовую строку.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 23:20 #8
охренеть вы даете. замутили премудрости и спрашиваете почему не работает.
раз у вас логически строка пустая, то вот такая ее проверка на пустоту неверна:
C++
1
 if (s.str)
потому что
на самом деле пуста, но ее указатель ссылается на базовую строку
раз так - пропишите правильную проверку на то, что строка пустая.
разбираться в ваших подсчетах ссылок как-то не очень хочется.
если ваша функция len работает правильно то
if (s.len() != 0) - может и проканает.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
26.02.2014, 23:25 #9
Небольшой совет в копилку: функция Erase должна учитывать ваш подсчет ссылок. Иначе вы инвалидируете остальные ссылки (скорее всего при обращении к ним программа рухнет).
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
26.02.2014, 23:25  [ТС] #10
Поясните, пожалуйста, в чем ошибка проверки указателя на строку?
C++
1
if (s.str)
Ведь в конструкторе str инициализируется нулем.
А в последствии, если там что-то появится, то это и будет выведено.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
26.02.2014, 23:31 #11
Цитата Сообщение от HenryDukart Посмотреть сообщение
Поясните, пожалуйста, в чем ошибка проверки указателя на строку?
ИМХО, само по себе это не ошибка.
Мне кажется вы несколько не готовы реализовывать строку с подсчетом ссылок, может быть сперва обычную копирующую реализовать? А потом уже модифицировать ее под подсчет. Чтобы с более цельной картиной работать.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.02.2014, 23:38 #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 и прочими прелестями?
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
26.02.2014, 23:48  [ТС] #13
Запись в строку я еще не реализовывал.
Ваши замечание учту, спасибо.
Но все же, как вернуть пустой поток?
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
26.02.2014, 23:53 #14
Цитата Сообщение от HenryDukart Посмотреть сообщение
Но все же, как вернуть пустой поток?
Просто ничего не писать туда. С этой точки зрения код оператора у вас корректный. Мы потому и начали смотреть остальной код, ибо есть подозрение, что падает не из-за конкретно оператора, а по другим причинам.
1
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
27.02.2014, 00:12  [ТС] #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)
Проблема решена.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2014, 00:12
Привет! Вот еще темы с ответами:

Где и почему используют ту или иную строку std::string, char[], System::String^ ? - C++
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните пожалуйста где нужно использовать...

Есть ли аналог Map <String,String> чтобы передавать его как указатель на данные? - C++
Добрый день, подскажите, есть ли аналог Map &lt;String,String&gt; чтобы передавать его как указатель на данные? Заранее спасибо!

Заменить использование istringstream на вариант из string или string.h - C++
Как заменить 14 строку функцией из &lt;string&gt; или &lt;string.h&gt; и без &lt;sstream&gt; {deleted} П.5.19.Правил Запрещено создавать темы в виде...

Идентификатор string не определён при наличии #include <string> - C++
Я ввёл библеотеку #include &lt;string&gt;, но не смотря на это мне выдаёт ошибку: &quot;индефикатор string не определён&quot;. Объясните, пожалуйста, это...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.02.2014, 00:12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru